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

作者站长头像
站长
· 阅读数 6

流程:

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

谢谢

回复
1个回答
avatar
test
2024-06-19

proto 并不支持多维数组。

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

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容