Как решить, какая структура подходит для размещения файла json

# #go

Вопрос:

У меня есть файл json, который выглядит следующим образом:

 {
   "Key1": "value1",
   "Key2": [
      "value2",
      "value3",
   ],
}
 

Я попытался использовать приведенную ниже структуру для десериализации json, однако после десериализации значение имеет только ключ2, ключ1 был пуст.

Вопрос: какова правильная структура для десериализации этого json?

 data := map[string][]string{}
_ = json.Unmarshal([]byte(file), amp;data)
 

Ответ №1:

С помощью struct

 type Test struct {
  Key1 string
  Key2 []string
}

func main() {
  testJson := `{"Key1": "value1","Key2": ["value2","value3"]}`
  var test Test 
  json.Unmarshal([]byte(testJson), amp;test)
  fmt.Printf("%s, %s", test.Key1 , test.Key2 )
}
 

ДЕМОНСТРАЦИЯ

Используя map

Мы создаем карту строк для пустых интерфейсов:

 var result map[string]interface{}
testJson := `{"Key1": "value1","Key2": ["value2","value3"]}`
var result map[string]interface{}
json.Unmarshal([]byte(testJson ), amp;result)
 

ДЕМОНСТРАЦИЯ

Ответ №2:

Вы можете декодировать этот Json в a map[string]interface{} , или в struct моделирование данных, или даже просто в пустой interface{}

Я обычно использую a struct , потому что это избавляет меня от необходимости выполнять утверждения типа (декодер обрабатывает эти данные).

Наконец, если вы по какой-либо причине не можете сразу декодировать структуру, я нахожу эту библиотеку весьма полезной: https://github.com/mitchellh/mapstructure

 package main

import (
    "bytes"
    "encoding/json"
    "fmt"
)

type Data struct {
    Key1 string
    Key2 []string
}

func main() {
    var data = `{
   "Key1": "value1",
   "Key2": [
      "value2",
      "value3"
   ]
}`
    mapdata := make(map[string]interface{})
    var inter interface{}
    obj := Data{}
    if err := json.
        NewDecoder(bytes.NewBufferString(data)).
        Decode(amp;mapdata); err != nil {
        panic(err)
    } else {
        fmt.Printf("Decoded to map: %#vn", mapdata)
    }
    if err := json.
        NewDecoder(bytes.NewBufferString(data)).
        Decode(amp;inter); err != nil {
        panic(err)
    } else {
        fmt.Printf("Decoded to interface: %#vn", inter)
    }
        if err := json.
        NewDecoder(bytes.NewBufferString(data)).
        Decode(amp;obj); err != nil {
        panic(err)
    } else {
        fmt.Printf("Decoded to struct: %#vn", obj)
    }
}

 
 Decoded to map: map[string]interface {}{"Key1":"value1", "Key2":[]interface {}{"value2", "value3"}}
Decoded to interface: map[string]interface {}{"Key1":"value1", "Key2":[]interface {}{"value2", "value3"}}
Decoded to struct: main.Data{Key1:"value1", Key2:[]string{"value2", "value3"}}
 

https://play.golang.org/p/K31dAVtWJNU