动态命名字段名称

问题描述 投票:0回答:2

我想创建一个JSON响应,其中父对象的字段名称具有动态名称。

最好通过示例进行说明。

现在,我的回答如下:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

为此,我创建了一个结构->填充它->返回它。

我的结构看起来像这样:

type Placeholder struct {
    userId    int    `json:"userId"`
    id        int    `json:"id"`
    title     string `json:"title"`
    completed bool   `json:"completed"`
}
//...
res := Placeholder{
  userId: 1,
  id: 1,
  title: "delectus aut autem",
  completed: false,
}

现在,我想使用userId作为字段名称。所以我想得到这个结果:

{
  "1": {
     "id": 1,
     "title": "delectus aut autem",
     "completed": false
  }
}

Go中是否有可能这样做?

go
2个回答
1
投票

仅将res的数据类型从Placeholder更改为map[int]Placeholder

userId := 1
res := map[int]Placeholder{
    userId: {
        id:        1,
        title:     "delectus aut autem",
        completed: false,
    },
}
fmt.Printf("%v", res)

游乐场:https://play.golang.org/p/rCBl2r7fQTe


0
投票

您可以使用json:",inline"嵌入结构。

NOTE:不要忽略真实代码中的错误!

type Placeholder struct {
    ID        int    `json:"id"`
    Title     string `json:"title"`
    Completed bool   `json:"completed"`
}

type PlaceholderWithUserID struct {
    UserID      int `json:"userId"`
    Placeholder `json:",inline"`
}

type PlaceholderMap map[int]Placeholder

func main() {
    var res PlaceholderWithUserID
    _ = json.Unmarshal([]byte(`{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}`), &res)
    mapping := PlaceholderMap{
        res.UserID: res.Placeholder,
    }
    out, _ := json.Marshal(mapping)
    fmt.Println(string(out))
}

Playgorund

© www.soinside.com 2019 - 2024. All rights reserved.