【问题标题】:Parse JSON from a JSON string value从 JSON 字符串值解析 JSON
【发布时间】:2018-04-13 06:37:10
【问题描述】:

我想从字符串转换为对象。

来自

{"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 这样的正则表达式来获取它,但现在这不是我的解决方案。

非常感谢您的宝贵时间和建议。对于我不成熟的问题,我很抱歉。

【问题讨论】:

  • @kostix 感谢您的编辑。

标签: json go struct


【解决方案1】:

有两个级别的 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

playground example

如果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

playground example

【讨论】:

  • 感谢您的回答。它工作得很好。我没有注意到使用struct。我接受了您的回答作为解决方案。谢谢。
  • 是的。感谢您增加更多知识。我想投票更多。但我已经投了赞成票。对不起。
  • 对不起。我可以问你关于我的问题的问题吗?我想将它们反映到我未来的问题中。顺便说一句,我想使用 golang 将字符串 JSON 转换为对象是错误的?
猜你喜欢
  • 2019-11-27
  • 2016-08-15
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多