[英]Golang: unmarshal json object into a slice
我有 JSON 之類的
{
"a": {"key": "a", "value": 1,},
"b": {"key": "b", "value": 1,},
}
有沒有辦法將它解組為[]*struct {Key string; Value int}
[]*struct {Key string; Value int}
,保留結構的順序?
如果我將 JSON 解組為map[string]*struct {Key string; Value int}
map[string]*struct {Key string; Value int}
然后將地圖轉換為切片,我將失去結構的順序。
要保留順序,請使用Decoder.Token和Decoder.More遍歷頂級 JSON 對象。
r := strings.NewReader(`
{
"a": {"key": "a", "value": 1},
"b": {"key": "b", "value": 1}
}`)
d := json.NewDecoder(r)
t, err := d.Token()
if err != nil || t != json.Delim('{') {
log.Fatal("expected object")
}
var result []*element
for d.More() {
k, err := d.Token()
if err != nil {
log.Fatal(err)
}
var v element
if err := d.Decode(&v); err != nil {
log.Fatal(err)
}
result = append(result, &v)
fmt.Println("key:", k, "value:", v)
}
將對 log.Fatal 的調用更改為適合您的應用程序的錯誤處理。
此答案編輯問題中的 JSON 以使 JSON 有效。
必須導出結構元素類型中的字段名稱。
我發現的最簡單的方法是使用jsonparser.ObjectEach
:
import "github.com/buger/jsonparser"
...
var ss []*struct{Key string; Value int}
err = jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {
var s struct{Key string; Value int}
if err := json.Unmarshal(value, &s); err != nil {
return err
}
*ss = append(*ss, &s)
return nil
})
您可以使用 map[string]interface{} 解組 json 字符串。 代碼是這樣的
func test() {
jsonStr := `
{
"a": {"key": "a", "value": 1},
"b": {"key": "b", "value": 1}
}`
var mapResult map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &mapResult)
if err != nil {
fmt.Println("JsonToMapDemo err: ", err)
}
fmt.Println(mapResult)
}
輸出為:map[a:map[key:a value:1] b:map[key:b value:1]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.