我想从字符串转换为对象。
发件人
{"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n}\n"}
要
{"key1": {"key2": "value2", "key3": {"key4": "value4"}}}
最后,我想获得value4
。
我可以使用下面的脚本获取“key1”的值。
jsondata := `{"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n}\n"}`
var m map[string]interface{}
json.Unmarshal([]byte(jsondata), &m)
value := m["key1"]
fmt.Println(value)
https://play.golang.org/p/4lwgQJfp5S
但我无法将值转换为对象。所以我不能得到“value4”。有这方法吗?我可以通过像https://play.golang.org/p/6TB-qNAdgQ这样的正则表达式获得它但现在这不是我的解决方案。
非常感谢你的时间和建议。对于我不成熟的问题,我很抱歉。
答案 0 :(得分:3)
JSON编码有两个级别。第一步是解码外部JSON值。解码为与JSON结构匹配的结构。
var outer struct{ Key1 string }
if err := json.Unmarshal([]byte(jsondata), &outer); err != nil {
log.Fatal(err)
}
下一步是解码内部JSON值。再次,解码为匹配JSON结构的结构。
var inner struct{ Key3 struct{ Key4 string } }
if err := json.Unmarshal([]byte(outer.Key1), &inner); err != nil {
log.Fatal(err)
}
// The value is inner.Key3.Key4
如果JSON没有经过双重编码,您可以一次解码:
jsondata := `{"key1": { "key2": "value2", "key3": { "key4": "value4" }}}`
var v struct {
Key1 struct{ Key3 struct{ Key4 string } }
}
if err := json.Unmarshal([]byte(jsondata), &v); err != nil {
log.Fatal(err)
}
// value is v.Key1.Key3.Key4