英文:
json unmarshalling without struct
问题
我已经翻译好了,以下是翻译的内容:
我有以下的 JSON 数据:
[{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/b;version=1493756861347"},{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/a;version=1493756856398"}]
根据给定的答案,我尝试了以下代码:
var objmap map[string]*json.RawMessage
err := json.Unmarshal(data, &objmap)
我得到了一个空数组,并出现了以下错误。有什么建议吗?
json: 无法将数组解组为类型为 map[string]*json.RawMessage 的 Go 值
英文:
I've following json
[{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/b;version=1493756861347"},{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/a;version=1493756856398"}]
Based on the given answer I've tried following
var objmap map[string]*json.RawMessage
err := json.Unmarshal(data, &objmap)
I'm getting empty array with following error. any suggestions?
> json: cannot unmarshal array into Go value of type map[string]*json.RawMessage
答案1
得分: 19
你可以按照以下方式将其反序列化为[]map[string]interface{}
:
data := []byte(`[{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/b;version=1493756861347"},{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/a;version=1493756856398"}]`)
var objmap []map[string]interface{}
if err := json.Unmarshal(data, &objmap); err != nil {
log.Fatal(err)
}
fmt.Println(objmap[0]["href"]) // 解析出你的值
要了解更多有关反序列化的工作原理,请参阅此处:https://godoc.org/encoding/json#Unmarshal
英文:
You can unmarshall to a []map[string]interface{}
as follows:
data := []byte(`[{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/b;version=1493756861347"},{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/a;version=1493756856398"}]`)
var objmap []map[string]interface{}
if err := json.Unmarshal(data, &objmap); err != nil {
log.Fatal(err)
}
fmt.Println(objmap[0]["href"]) // to parse out your value
To see more on how unmarshalling works see here: https://godoc.org/encoding/json#Unmarshal
答案2
得分: 2
这不是直接的答案,但我认为非常有用。
无需结构体的Json Unmarshal和Indent
func JsonIndent(jsontext []byte) ([]byte, error) {
var err error
var jsonIndent []byte
var objmap map[string]*json.RawMessage
err = json.Unmarshal(jsontext, &objmap)
if err != nil {
return jsonIndent, err
}
jsonIndent, err = json.MarshalIndent(objmap, "", " ")
return jsonIndent, err
}
英文:
This is not direct answer but I think very useful
Json Unmarshal & Indent without struct
<pre><code>
func JsonIndent (jsontext []byte) ([]byte,error) {
var err error
var jsonIndent []byte
var objmap map[string]*json.RawMessage
err = json.Unmarshal(jsontext, &objmap)
if err != nil {
return jsonIndent,err
}
jsonIndent, err = json.MarshalIndent(objmap,"", " ")
return jsonIndent,err
}
</code></pre>
答案3
得分: 1
你的json
是一个对象数组,在Go语言中,encoding/json
包将map
与json对象进行编组/解组,而不是数组,所以你可能想要分配一个map的切片
。
var objs []map[string]*json.RawMessage
if err := json.Unmarshal([]byte(data), &objs); err != nil {
panic(err)
}
如果你不想使用切片,你可以将json数组包装在一个对象中。
var dataobj = `{"arr":` + data + `}`
var objmap map[string]*json.RawMessage
if err := json.Unmarshal([]byte(dataobj), &objmap); err != nil {
panic(err)
}
英文:
Your json
is an array of objects, in Go the encoding/json
package marshals/unmarshals maps
to/from a json object and not an array, so you might want to allocate a slice of maps
instead.
var objs []map[string]*json.RawMessage
if err := json.Unmarshal([]byte(data), &objs); err != nil {
panic(err)
}
https://play.golang.org/p/3lieuNkoUU
If you don't want to use a slice you can always wrap your json array in an object.
var dataobj = `{"arr":` + data + `}`
var objmap map[string]*json.RawMessage
if err := json.Unmarshal([]byte(dataobj), &objmap); err != nil {
panic(err)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论