Javascript js将proto文件转换为JSON描述符,重复会丢失

Javascript js将proto文件转换为JSON描述符,重复会丢失,javascript,json,protocol-buffers,protobuf.js,Javascript,Json,Protocol Buffers,Protobuf.js,我正在使用构建一个节点包,其中包含我们的协议,并为该包中定义的Proto消息提供编码和解码功能。我可以使用.proto文件(在运行时加载.proto文件),但由于模块需要在客户端可用,并且我无法将.proto文件打包到解析的.js文件(使用browserify构建)中,因此我需要使用一种方法,在build.js中启用打包 输入JSON描述符 var jsonDescriptor = require("./awesome.json"); // exemplary for node var roo

我正在使用构建一个节点包,其中包含我们的协议,并为该包中定义的Proto消息提供编码和解码功能。我可以使用.proto文件(在运行时加载.proto文件),但由于模块需要在客户端可用,并且我无法将.proto文件打包到解析的.js文件(使用browserify构建)中,因此我需要使用一种方法,在build.js中启用打包

输入JSON描述符

var jsonDescriptor = require("./awesome.json"); // exemplary for node

var root = protobuf.Root.fromJSON(jsonDescriptor);
json文件可以打包(需求由browserify解决)。在.json中也可以使用原型定义

我将.proto文件转换为.json文件,并使用示例数据进行了尝试不幸的是,它在重复字段时失败。

.proto文件看起来像这样:

message Structure {
    map <int32, InnerArray> blocks = 1;
}

message Inner{
    int32 a = 1;
    int32 b = 2;
    bool c = 3;
}

message InnerArray{
    repeated Inner inners = 1;
}   
如果我没有弄错的话,这里有一个字段的属性

当我对示例数据进行编码和解码时,它会在repeated字段处停止:(注意,映射工作正常)

我还检查了我的根,以了解加载的类型的外观,它与我的定义完全相同,只是缺少重复的

"InnerArray" : {
            "fields": {
                "inners" : {
                    "type" : "Inner",
                    "id" : 1
                }
            }
        },
如何在JSON描述符中正确定义重复字段?


如果有一种方法可以预先包含proto文件,而不在运行时加载它们,这样我就可以用browserify将它们包装起来,我也会接受这一解决方案。

浏览代码后,我发现您无法在JSON描述符中设置required。 正确的方法是设置
“规则”:“重复”
; 因为字段设置了

{
  "blocks": {
    "0": {
      "inners": {}
    },
    ...
"InnerArray" : {
            "fields": {
                "inners" : {
                    "type" : "Inner",
                    "id" : 1
                }
            }
        },