无法读取TypeScript/JavaScript GRPC google.protocol buf.Struct [英] TypeScript / JavaScript gRPC google.protobuf.Struct cannot be read

查看:18
本文介绍了无法读取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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆