protobuf.js 将 proto 文件翻译成 JSON 描述符,重复会丢失

protobuf.js translate proto file to JSON descriptor, repeated gets lost

我正在使用 Protobuf.js 构建节点包,其中包含我们的协议并为该包中定义的 Proto Messages 提供编码和解码功能。我可以使用 .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;
}   

我翻译成这个JSON描述符

{
  "nested": {
    "Structure": {
      "fields": {
        "blocks": {
          "type": "InnerArray",
          "id": 1,
          "map" : true,
          "keyType" : "int32"
        }
      }
    },
    "InnerArray" : {
        "fields": {
            "inners" : {
                "repeated" : true,
                "type" : "Inner",
                "id" : 1
            }
        }
    },
    "Inner" : {
        "fields" : {
            "a" : {
                "type" : "int32",
                "id" : 1
            },
            "b" : {
                "type" : "int32",
                "id" : 2
            },
            "c" : {
                "type" : "bool",
                "id" : 3
            }
        }
    }
  }
}

如果我没记错的话,字段有 required 属性。

当我对我的示例数据进行编码和解码时,它在重复字段处停止:(请注意地图工作正常)。

{
  "blocks": {
    "0": {
      "inners": {}
    },
    ...

我还检查了我的根以了解加载类型的外观,它看起来与我的定义 EXCEPT 完全一样,但 repeated 丢失了:

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

如何在 JSON 描述符中正确定义重复字段?

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

浏览代码后,我发现您无法在 JSON 描述符中设置 required 。 正确的方法是设置 "rule": "repeated"; 因为字段设置为 Field Descriptor