proto3处理二维数组会转换为map形式?

流程:

  • 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模式怎么看怎么别扭

谢谢

阅读 601
1 个回答

proto 并不支持多维数组。

不过,在它的 well-know types,通过 Value, ListValue, Struct 提供了对任意 Json 的支持。多维数组可以使用嵌套的 ListValue 的实现,但是结构的具体细节就不能在 proto 文件里体现了。(比如数组到底有几维,数组的元素到底是什么,以及你的 Tool_item message 在 proto 里就都没有了。)估计也不太能用 viper 自动处理了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏