流程:
- json作为数据
- viper解析
- grpc通信
json:
{
...省略其他
"toolbar": {
"column": [
[
{
"name": "",
"role": ""
}
]
],
"row": []
}}
proto:
message Tool_bar {
message Tool_item {
string name = 1;
string role = 2;
}
message Array2D {
repeated Tool_item inner_array = 1;
}
repeated Array2D column = 1;
}
生成的go代码
type ConfigReply_Array2D struct {
...
InnerArray []*ConfigReply_ToolItem `protobuf:"bytes,1,rep,name=inner_array,json=innerArray,proto3" json:"inner_array,omitempty"`
}
type ConfigReply_ToolBar struct {
...
Column []*ConfigReply_Array2D `protobuf:"bytes,1,rep,name=column,proto3" json:"column,omitempty"`
...
}
目前卡在viper解析proto文件生成的struct报错:'Toolbar.Column[0]' expected a map, got 'slice'\n*
原因很简单,viper需要的是
type ToolBar struct {
Name string `json:"name"`
Role string `json:"role"`
}
type Xxx struct {
ToolBar struct {
Column [][]ToolBar `json:"column"`
Row [][]ToolBar `json:"row"`
} `json:"toolbar"`
}
生成的代码却多了一个InnerArray
请问,这该怎么办?
最好不要改json格式,需要的就是二维数组,改成map模式怎么看怎么别扭
谢谢
proto 并不支持多维数组。
不过,在它的 well-know types,通过 Value, ListValue, Struct 提供了对任意 Json 的支持。多维数组可以使用嵌套的 ListValue 的实现,但是结构的具体细节就不能在 proto 文件里体现了。(比如数组到底有几维,数组的元素到底是什么,以及你的 Tool_item message 在 proto 里就都没有了。)估计也不太能用 viper 自动处理了。