Чистый способ условно разобрать JSON для структурирования - PullRequest
0 голосов
/ 28 июня 2018

Я отправляю запросы в JSON API, и он либо возвращает ошибку ...

{
  "error": {
    "code": 404,
    "message": "Document not found.",
    "status": "NOT_FOUND"
  }
}

или данные.

{
  "name": "projectname",
  "fields": {
    "userId": {
      "stringValue": "erw9384rjidfge"
    }
  },
  "createTime": "2018-06-28T00:52:25.638791Z",
  "updateTime": "2018-06-28T00:52:25.638791Z"
}

Вот соответствующие структуры

type HttpError struct {
    Code    int    `json:"code"`
    Message string `json:"message"`
    Status  string `json:"status"`
}

type Document struct {
    Name   string `json:"name"`
    Fields struct {
        UserID struct {
            StringValue string `json:"stringValue"`
        } `json:"userId"`
    } `json:"fields"`
    CreateTime time.Time `json:"createTime"`
    UpdateTime time.Time `json:"updateTime"`
}

Как только я получу ответ, как мне четко / кратко разобрать правильную структуру? Я видел много уродливых решений (возможно, виноват Го, а не писатели).

func getDocument() {
    resp, _ := httpClient.Get("example.com")
    defer resp.Body.Close()
    bodyBytes, _ := ioutil.ReadAll(resp.Body)

    var data map[string]interface{}
    // How to unmarshal to either HttpError or Document??
    err = json.Unmarshal([]byte(bodyBytes), &data)

}

Кстати, я не могу использовать клиентскую библиотеку Go Firestore по причинам.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать тип struct внутри вашего unmarshal метода; с указателями, чтобы установить, что было разобранным.

Примечание: В этом коде предполагается, что нет никаких совпадений ключей json верхнего уровня ... error / name / fields / etc.

type outer struct {
    *HttpError `json:"error"`
    *Document
}

var out outer

if err := json.Unmarshal(bodyBytes, &out); err != nil {
    // error handling
}

if out.HttpErr != nil {
    // handle error json case
}

// Here you can use out.Document, probably worth check if it is nil first.

Пример запуска

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