Проблема с демаршалингом вложенного json с неизвестными ключами

У меня возникли проблемы с демаршалингом данных json в формате ниже в структуру. Структура json кажется мне немного запутанной, поэтому приношу свои извинения за все глупости, которые я делаю, чтобы разобрать его.

{
  "message": {
    "Server1.example.com": [
      {
        "application": "Apache", 
        "host": {
          "name": "/^Server-[13456]/"
        }, 
        "owner": "User1", 
        "project": "Web", 
        "subowner": "User2"
      }
    ], 
    "Server2.example.com": [
      {
        "application": "Mysql", 
        "host": {
          "name": "/^Server[23456]/"
        }, 
        "owner": "User2", 
        "project": "DB", 
        "subowner": "User3"
      }
    ] 
  }, 
  "response_ms": 659, 
  "success": true
}

Я пытаюсь демаршалировать его, используя следующую структуру.

type ServerDetails struct  {
  Message  struct{
    Hostname struct{
      Details struct{
        Application string `json:"application"`
        }`json:"-"`
       }`json:"-"`
     }`json:"message"`
}

Поля Server[0-9].example.com будут неизвестны во время генерации и будут меняться, и есть это поле

      {
    "application": "Apache", 
    "host": {
      "name": "/^Server-[13456]/"
    },

сразу после имени сервера, у которого нет ключа снаружи, что снова меня сбивает с толку. Я попробовал большое количество комбинаций, чтобы понять, как это можно разобрать, но у меня ничего не вышло.

Каков рабочий подход к демаршалированию полей json в структуру?


person scott    schedule 09.11.2016    source источник
comment
Используйте map[string]whateverstruct, чтобы демаршалировать объекты с различными ключами.   -  person Volker    schedule 09.11.2016
comment
Спасибо, @Volker, ты спас мне день. Я соответствующим образом изменил, и это сработало. Не могли бы вы добавить это в качестве ответа, и я бы принял его.   -  person scott    schedule 09.11.2016


Ответы (2)


Вы можете включить карту [строка] ServerStruct, чтобы удовлетворить ваши требования.

ваша структура может выглядеть так:

type YourStruct struct {
    Success bool
    ResponseMS int
    Servers map[string]*ServerStruct
}

type ServerStruct struct {
    Application string
    Owner string
    [...]
}

С некоторыми дополнительными тегами json вы сможете анализировать свой json.

person user2326871    schedule 09.11.2016

Ваш JSON недействителен с лишней запятой после второй] После исправления JSON вы можете использовать отличный https://mholt.github.io/json-to-go/, чтобы создать следующую структуру Go

type AutoGenerated struct {
    Message struct {
        Server1ExampleCom []struct {
            Application string `json:"application"`
            Host struct {
                Name string `json:"name"`
            } `json:"host"`
            Owner string `json:"owner"`
            Project string `json:"project"`
            Subowner string `json:"subowner"`
        } `json:"Server1.example.com"`
        Server2ExampleCom []struct {
            Application string `json:"application"`
            Host struct {
                Name string `json:"name"`
            } `json:"host"`
            Owner string `json:"owner"`
            Project string `json:"project"`
            Subowner string `json:"subowner"`
        } `json:"Server2.example.com"`
    } `json:"message"`
    ResponseMs int `json:"response_ms"`
    Success bool `json:"success"`
}
person Franck Jeannin    schedule 09.11.2016
comment
К сожалению, кома была недействительной, когда я обрезал json. Я поправлю. Но поскольку json имеет переменные ключи, которые неизвестны во время генерации, я не могу жестко закодировать server1.example.com в структуру. Это может измениться. - person scott; 09.11.2016
comment
Ты прав. Инструмент по-прежнему является отличным инструментом, когда формат JSON известен заранее. - person Franck Jeannin; 09.11.2016
comment
Да согласен. +1 за предложение такого удобного инструмента :-) - person scott; 09.11.2016