英文:
How to decide what struct is proper to accommodate a json file
问题
我有一个json文件,看起来像下面这样:
{
"Key1": "value1",
"Key2": [
"value2",
"value3",
],
}
我尝试使用下面的结构体来反序列化这个json,但是在反序列化之后,只有key2有值,key1是空的。
**问题:**正确的结构体是什么,可以用来反序列化这个json?
data := struct {
Key1 string
Key2 []string
}{}
_ = json.Unmarshal([]byte(file), &data)
英文:
I have a json file, which looks like below:
{
"Key1": "value1",
"Key2": [
"value2",
"value3",
],
}
I tried to use below struct to deserialize the json, however, after deserialization, only key2 has value, key1 was empty.
Question: what is the proper struct to deserialize this json?
data := map[string][]string{}
_ = json.Unmarshal([]byte(file), &data)
答案1
得分: 0
使用struct
type Test struct {
Key1 string
Key2 []string
}
func main() {
testJson := `{"Key1": "value1","Key2": ["value2","value3"]}`
var test Test
json.Unmarshal([]byte(testJson), &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), &result)
英文:
Using struct
type Test struct {
Key1 string
Key2 []string
}
func main() {
testJson := `{"Key1": "value1","Key2": ["value2","value3"]}`
var test Test
json.Unmarshal([]byte(testJson), &test)
fmt.Printf("%s, %s", test.Key1 , test.Key2 )
}
Using a map
We create a map of strings to empty interfaces:
var result map[string]interface{}
testJson := `{"Key1": "value1","Key2": ["value2","value3"]}`
var result map[string]interface{}
json.Unmarshal([]byte(testJson ), &result)
答案2
得分: 0
你可以将该JSON解码为map[string]interface{}
,或者使用一个模拟数据的struct
,甚至只是一个空的interface{}
。
通常我会使用struct
,因为它避免了我需要进行类型断言的需要(解码器会处理这些内容)。
最后,如果由于某种原因无法立即解码为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(&mapdata); err != nil {
panic(err)
} else {
fmt.Printf("Decoded to map: %#v\n", mapdata)
}
if err := json.
NewDecoder(bytes.NewBufferString(data)).
Decode(&inter); err != nil {
panic(err)
} else {
fmt.Printf("Decoded to interface: %#v\n", inter)
}
if err := json.
NewDecoder(bytes.NewBufferString(data)).
Decode(&obj); err != nil {
panic(err)
} else {
fmt.Printf("Decoded to struct: %#v\n", 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
英文:
You can decode that Json into a map[string]interface{}
, or a struct
modeling the data, or even just an empty interface{}
I typically use a struct
because it avoids any need for me to do type assertions (the decoder handles that stuff).
Finally, if you can't for whatever reason immediately decode into a struct, I've found this library to be quite helpful: 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(&mapdata); err != nil {
panic(err)
} else {
fmt.Printf("Decoded to map: %#v\n", mapdata)
}
if err := json.
NewDecoder(bytes.NewBufferString(data)).
Decode(&inter); err != nil {
panic(err)
} else {
fmt.Printf("Decoded to interface: %#v\n", inter)
}
if err := json.
NewDecoder(bytes.NewBufferString(data)).
Decode(&obj); err != nil {
panic(err)
} else {
fmt.Printf("Decoded to struct: %#v\n", 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"}}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论