是否可以在 JSON 中制作自定义对象键?

ty1*_*ty1 0 json go

我一直在研究 Go API,我需要对一些 JSON 进行编码才能提供服务。

我的结构是这样的:

{
  "20.0.12":{
     "someData":"yes",
     "someMoreData":"no",
     "littleMore":"ok"
  },
  "20.0.13":{
     "someData":"AH",
     "someMoreData":"blue",
     "littleMore":"red"
  }
}
Run Code Online (Sandbox Code Playgroud)

所以子数据有具体的标题。someData、someMoreData 和 littleMore。这些头衔永远不会改变。但是,父级确实 - 20.0.12 和 20.0.13

我们可以在 Go 中使用如下结构创建 JSON:

type TestData struct{
  SomeData     string `json:"someData"`
  SomeMoreData string `json:"someMoreData"`
  LittleMore   string `json:"littleMore"`
}
Run Code Online (Sandbox Code Playgroud)

然后只需运行一个 json.NewEncoder(someVar).Encode({some instance of TestData})

是否可以让这些键是动态的?例如,如果我不想让 someData 总是说 someData?例如,我正在使用的数据库将该键从 someData 更改为 someDataX。是否可以让我的 json 密钥反映这一点?下面的代码不会运行,但这是我想要实现的:

type TestData (arg string, arg2  string){
   arg  string  `json:"`+arg+`"`
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ian 6

正如您在问题末尾所描述的那样,您不能拥有运行时动态类型,但为此您不需要它们;你只需要一个map. 您还需要导出你的结构域,如果你想和使用它们encoding/json。例如:

type TestData struct {
    SomeData     string `json:"someData"`
    SomeMoreData string `json:"someMoreData"`
    LittleMore   string `json:"littleMore"`
}

myData := map[string]TestData{
    "20.0.12": TestData{
        SomeData:     "yes",
        SomeMoreData: "no",
        LittleMore:   "ok",
    },
    "20.0.13": TestData{
        SomeData:     "AH",
        SomeMoreData: "blue",
        LittleMore:   "red",
    },
}

json.NewEncoder(someWriter).Encode(myData)
Run Code Online (Sandbox Code Playgroud)

在此处查看工作示例:https : //play.golang.org/p/62mgpdY_v7c