Как переформатировать JSON через структуру? - PullRequest
0 голосов
/ 10 сентября 2018

Я вытащил некоторые данные из данной базы данных - однако формат не соответствует желаемому.

Пример структуры:

type myStruct struct {
    ID                  int    `json:"Id"`
    Language            string `json:"Language"`
    Location            string `json:"Location"`
}

Правильно, я сериализую заданную карту строк с пользовательской структурой, представляющей заданные возвращенные столбцы:

func transformJSON(extract []map[string]*sql.SqlCell) ([]byte, error) {
    return json.MarshalIndent(extract, "", " ")
}

Возвращает действительный JSON, но в формате:

  {
      {
      "id": {
       "Value": {
        "Long": 12353
       }
      },
      "language": {
       "Value": {
        "String_": "ja-JP"
       }
      },
      "location": {
       "Value": {
        "String_": "Osaka"
       }
  },

Ссылаясь на мою структуру выше, я хотел бы иметь такой формат:

 [
  {
    "Id": 12353,
    "Language": "ja-JP",
    "Location": "Osaka"
  },
  // .. other objects
 ]

Предполагая, что тот же самый ввод для func transformJSON, как бы я сопоставил вложенные ключи со значениями типа столбца?

Должен ли я Marshal сначала карту, затем преобразовать данные - или работать непосредственно со структурой данных []map[string]*sql.SqlCell до маршала?

В своей голове я думал так:

func transformJSON(extract []map[string]*sql.SqlCell) ([]byte, error) {
    struct :=[] myStruct{}
    // Loop over extract objects, match nested keys, write to struct?

    return json.MarshalIndent(struct, "", " ")
}

1 Ответ

0 голосов
/ 10 сентября 2018

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

type MyStruct struct {
    ID                  int    `json:"Id"`
    Language            string `json:"Language"`
    Location            string `json:"Location"`
}

type val struct {
    Value struct {
        String string `json:"String_"`
        Long   int    `json:"Long"`
    }
}

func (s *MyStruct) UnmarshalJSON(p []byte) error {
    var result struct{
        ID       val `json:"Id"`
        Language val `json:"language"`
        Location val `json:"location"`
    }
    if err := json.Unmarshal(p, &result); err != nil {
        return err
    }
    s.ID = result.ID.Value.Long
    s.Language = result.Langauge.Value.String
    s.Location= result.Location.Value.String
    return nil
}

Обратите внимание, что в этом примере выполняется минимальная проверка ошибок и проверка данных - я оставляю это в качестве упражнения для читателя.

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