# #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"}}