为了账号安全,请及时绑定邮箱和手机立即绑定

解组 JSON 时接受 proto 结构中的动态键

解组 JSON 时接受 proto 结构中的动态键

Go
慕的地6264312 2022-10-17 10:15:58
我的 Proto 文件看起来像这样:    message Test {        Service services = 1;    }        message Service {        string command = 1;        string root = 2;    }这个 .proto 可以支持这样的 json:    {            "services": {                   "command": "command2",                "root": "/"             },    }但是,我想管理一个看起来像这样的 json:       {                "services": {                        "service1": {                            "command": "command1",                            "root": "/"                        },                        "service2": {                            "command": "command2",                            "root": "/"                        },                },        }因此,这里所有的服务都将具有共同的结构,但键名会有所不同(即"service1", "service2")现在,我想从 test.json 读取数据并解组它:    var test *Test    err := json.Unmarshal([]byte(file), &test)我应该做些什么改变.proto才能成功解组这个json?
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

使用原型图:


message Test {

    map<string, Service> services = 1;

}


message Service {

    string command = 1;

    string root = 2;

}

proto map 是在 Go中编译的,因此在这种情况下,这是使用任意键对 JSON 建模的推荐方法。map[K]Vmap[string]*Service


这将给出以下输出:


services:{key:"service1" value:{command:"command1" root:"/"}} services:{key:"service2" value:{command:"command2" root:"/"}}

示例程序:


package main


import (

    "encoding/json"

    "example.com/pb"

    "fmt"

)


const file = `{

            "services": {

                    "service1": {

                        "command": "command1",

                        "root": "/"

                    },

                    "service2": {

                        "command": "command2",

                        "root": "/"

                    }

            }

    }

`



func main() {

    test := &pb.Test{}

    err := json.Unmarshal([]byte(file), test)

    if err != nil {

        panic(err)

    }

    fmt.Println(test)

}


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信