Dynami c именованных имен полей - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу создать ответ JSON, где имя поля родительского объекта имеет динамическое c имя.

Это лучше объяснить на примере.

Прямо сейчас мой ответ выглядит так:

{
  "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?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Просто измените тип данных 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 голосов
/ 20 февраля 2020

Вы можете встроить структуру с помощью json:",inline".

ПРИМЕЧАНИЕ: не пропускайте ошибки в реальном коде!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...