Разматывание вложенных ответов данных в структуры, когда срез является частью ответа - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы получить некоторую информацию о том, как вы все go расскажете о раскрутке вложенных данных ответов в пользовательские структуры. Ниже приведен пример данных, которые мне возвращают. Я пытаюсь получить пользовательские данные.

{
  "_links": {
    "self": {
      "href": "/api/v2/user-search/default/test?after=1585612800000&limit=20&offset=0&q=johnsmith%40test.com",
      "type": "application/json"
    }
  },
  "totalCount": 1,
  "items": [
    {
      "lastPing": "2020-04-30T02:56:10.430867577Z",
      "environmentId": "xxxx",
      "ownerId": "xxxx",
      "user": {
        "key": "johnsmith@test.com",
        "email": "johnsmith@test.com",
        "firstName": "john",
        "lastName": "smith"
      },
      "_links": {
        "parent": {
          "href": "/api/v2/users/default/test",
          "type": "application/json"
        },
        "self": {
          "href": "/api/v2/users/default/test/johnsmith@test.com",
          "type": "application/json"
        },
        "settings": {
          "href": "/api/v2/users/default/test/johnsmith@test.com/flags",
          "type": "text/html"
        },
        "site": {
          "href": "/default/test/users/johnsmith@test.com",
          "type": "text/html"
        }
      }
    }
  ]
}

В настоящее время я делаю следующее

respData := map[string][]map[string]map[string]interface{}{}
json.Unmarshal(respBody, &respData)

userData := respData["items"][0]["user"]

Я бы хотел иметь возможность разобрать его в пользовательскую структуру но я не могу заставить его работать. Вложенный фрагмент, внутри которого находится пользовательский объект, - это то, что меня отбрасывает.

Ответы [ 3 ]

3 голосов
/ 30 апреля 2020
type User struct {
    Key       string `json:"key"`
    Email     string `json:"email"`
    FirstName string `json:"firstName"`
    LastName  string `json:"lastName"`
}

type LinkInfo struct {
    Href string `json:"href"`
    Type string `json:"type"`
}

type Item struct {
    LastPing      time.Time `json:"lastPing"`
    EnvironmentID string    `json:"environmentId"`
    OwnerID       string    `json:"ownerId"`
    User          User      `json:"user"`
    Links         LinkInfo  `json:"_links"`
    Self          LinkInfo  `json:"self"`
    Settings      LinkInfo  `json:"settings"`
    Parent        LinkInfo  `json:"parent"`
    Site          LinkInfo  `json:"site"`
}

type ItemDetails struct {
    Links      LinkInfo `json:"_links"`
    TotalCount int      `json:"total_count"`
    Items      []Item
}

Можете ли вы попробовать это?

https://play.golang.org/p/S_CUN0XEh-d

1 голос
/ 30 апреля 2020

Если вы хотите это:

"user": {
    "key": "johnsmith@test.com",
    "email": "johnsmith@test.com",
    "firstName": "john",
    "lastName": "smith"
}

Объявите соответствующую Go struct:

type User struct {
    Key       string `json:"key"`
    Email     string `json:"email"`
    FirstName string `json:"firstName"`
    LastName  string `json:"lastName"`
}

Тогда, поскольку родительский объект пользователя выглядит следующим образом:

"items": [
    {
        "lastPing": "2020-04-30T02:56:10.430867577Z",
        "environmentId": "xxxx",
        "ownerId": "xxxx",
        "user": { ... },
        "_links": { ... }
    }
]

вам также нужно объявить соответствующую Go структуру для этого (вы можете опустить поля, которые вам не нужны):

type Item struct {
    User User `json:"user"`
}

и затем родительский элемент для родительского элемента:

{
    "_links": {
        "self": {
            "href": "/api/v2/user-search/default/test?after=1585612800000&limit=20&offset=0&q=johnsmith%40test.com",
            "type": "application/json"
        }
    },
    "totalCount": 1,
    "items": [ ... ]
}

и соответствующая Go структура для дедушки, опять же, включают только те поля, которые вам нужны:

type ResponseData struct {
    Items []Item `json:"items"`
}

Получив это, вы можете декодировать json в экземпляр ResponseData:

var rd ResponseData
if err := json.Unmarshal(data, &rd); err != nil {
    panic(err)
}
for _, item := range rd.Items {
    fmt.Println(item.User)
}

https://play.golang.com/p/7yavVSBcHQP

1 голос
/ 30 апреля 2020

Из того, что вы упомянули, звучит, как будто вы на правильном пути. Ваш JSON довольно большой, поэтому позвольте мне привести пример меньшего размера, похожий на ту часть, о которой вы упоминали, с которой у вас возникли проблемы (объект user в списке items).

type response struct {
  TotalCount int `json:"totalCount"`
  Items []*itemStruct `json:"items"`
}

type itemStruct struct {
  LastPing string `json:"lastPing"`
  User *userStruct `json:"user"`
}

type userStruct struct {
  Key string `json:"key"`
}

По существу, чтобы отобразить список объектов JSON, просто поместите в свою структуру поле, подобное этому: Objects []*structWhichMapsToMyObject

Редактировать: Вот код, работающий в Go Playground: https://play.golang.org/p/EvSvv-2s8y8

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