我正在使用Protobuf.js构建一个节点包,其中包含我们的协议,并为此包中定义的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解析)。 Proto Type Defintions也可以在.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": {}
},
...
我还检查了我的root,以了解加载类型的外观,看起来与我的定义 EXCEPT 完全相同,重复丢失:
"InnerArray" : {
"fields": {
"inners" : {
"type" : "Inner",
"id" : 1
}
}
},
如何在JSON描述符中正确定义重复字段?
如果有办法预先包含proto文件而不在运行时加载它们,那么我可以用browserify包装它们,我也会接受这个作为解决方案。
答案 0 :(得分:5)
浏览完代码后,我发现您无法在JSON描述符中设置必需。
正确的方法是设置
"rule": "repeated"
;
因为字段设置为Field Descriptor