Разобрать json в несколько структур в Go - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть случай, когда мне нужно проанализировать длинный json в нескольких структурах. Примером является:

type AutoGenerated struct {
    Instance []Instance `json:"instance"`
}
type Test1 struct {
        Envid   string `json:"envid"`
        Narid   string `json:"narid"`
        Pod     []Pod  `json:"pod"`
        Regions string `json:"regions"`
        Type    string `json:"type"`
}
type JavaTest struct {
    JavaOutput     string `json:"java output"`
    JvmVersion     string `json:"jvm_version"`
}
type Container struct {
    Java []Java `json:"java"`
    Name string `json:"name"`
}
type Pod struct {
    Container []Container `json:"container"`
    Name      string      `json:"name"`
}

type Instance struct {
        Test1 Test1 `json:"test1,omitempty"`
        Test2 Test2 `json:"test2,omitempty"`
}

Хотя Unmarshalling JSON, я не совсем уверен, как это должно быть сделано. Если я сделаю: var test AutoGenerated и использую это для демаршалирования, я пропущу поля из JavaTest struct наподобие JvmVersion. Есть ли способ получить значения заполнения в разных структурах из одного JSON? Обратите внимание, что у меня много разных структур, подобных этой.

Пример json фрагмент:

{
  "instance": [
    {
      "test1": {
        "envid": "test1",
        "narid": "",
        "pod": [
          {
            "container": [
              {
                "java": [
                  {
                    "java output": "asdsadasdasdasd",
                    "jvm_version": "1.8.0_152",
                    "path": "/abc/aa/11/80/aaaaaa/bbb/aaa",
                    "publisher": "Java asdsad"
                  }
                ],
                "name": "test"
              }
            ],
            "name": "test-2-6n8xc"
          }
        ],
        "regions": "abc",
        "type": "xyz"
      }
    }
  ]
}

1 Ответ

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

Решением этой проблемы было изменение определения структуры. Ниже были внесены изменения:

  1. Изменить AutoGenerated struct на:
type AutoGenerated struct {
    Instance []map[string]Instance `json:"instance"`
}
Изменить Instance struct на:
type Instance struct {
        Envid string `json:"envid"`
        Narid string `json:"narid"`
        Pod   []Pod  `json:"pod"`

}

Пожалуйста, прочитайте обсуждение в комментарии, чтобы понять, почему были сделаны эти изменения. По сути, я хотел l oop над полями структуры Instance, что было возможно только с помощью отражения (менее желательное решение). Таким образом, решение правильного разбора этого json было предложено в комментариях с использованием карты для экземпляра.

Я также полностью удалил отдельные структуры для полей экземпляра, такие как Test1, Test2, et c.

Спасибо всем, кто помог мне решить эту проблему.

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