无法读取TypeScript/JavaScript GRPC google.protocol buf.Struct [英] TypeScript / JavaScript gRPC google.protobuf.Struct cannot be read
本文介绍了无法读取TypeScript/JavaScript GRPC google.protocol buf.Struct的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个TypeScript服务器试图使用Struct读取JSON对象,但它似乎只对包含";field";键的对象部分起作用,然后它会将对象作为值。尽管如此,Struct应该适用于任何JSON对象。
使用BloomRPC我正在尝试以下消息:
{
"payload": {
"fields": {
"Hello": {
"whatever": 0
}
}
}
}
服务器读取:
{ fields: { Hello: {} } }
如果我发送:
{
"payload": {
"anotherfield": {
"HelloWorld": {
"whatever": 0
}
}
}
}
我在服务器上获得一个空对象。
简化的protocol buf文件如下所示:
syntax = "proto3";
import "google/protobuf/struct.proto";
// The service definition.
service TestTicketService {
rpc UpdateTicket (UpdateTicketRequest) returns (UpdateTicketResponse);
}
// The request message containing the required ticket information.
message UpdateTicketRequest {
string ticketId = 1;
google.protobuf.Struct payload = 2;
}
// The response message containing any potential error message
message UpdateTicketResponse {
string error = 1;
}
你知道为什么google/protocol buf/struct.proto没有按预期工作吗?
推荐答案
结构的概念是您可以存储任意数据,但只能存储简单类型:NULL、NUMBER、String、BOOL、ARRAY和OBJECT。
这完美地映射到JSON,这不是偶然的。 google.protocol buf.Struct消息具有特殊的JSON表示:
Struct
的JSON表示形式是JSON对象。
这样您就可以将任何JSON字符串解析为协议Buf Struct,并且当再次序列化到JSON时,您也会再次获得相同的JSON字符串。
需要注意的是,解析后的Struct的内存表示不等于JSON对象。Protobuf没有动态字段,必须以更复杂的方式表示JSON数据。这就是struct.proto定义其他一些类型的原因。当您想要在JavaScript中创建Struct时,最简单的方法可能就是只创建您想要的JSON对象:
var jsonObject = {foo: "bar"};
var jsonString = JSON.stringify(jsonObject);
现在您可以从此jsonObject或jsonString分析您的Struct,并将Set Resulting Struct作为字段值放入另一个协议buf消息中。
因为您已经在使用TypeScript,所以可能值得查看一种可供选择的Protobuf TypeScript实现。 我是protobuf-ts的作者。创建结构非常简单:
let struct = Struct.fromJson({foo: "bar"});
这篇关于无法读取TypeScript/JavaScript GRPC google.protocol buf.Struct的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文