如何获取JSON中含Unicode码点的键对应的值?
问题原因与解决方案
为什么映射失败?
你的代码存在两个关键的转义处理差异:
- JSON数据用Go的反引号字符串定义,其中的
"foobar\u0062"会被原样保留为JSON的键(即键是字面的foobar\u0062字符串,包含\u0062这几个字符)。 - 结构体标签里的
json:"foobar\u0062"是双引号包裹的,Go编译器会自动解析Unicode转义序列,把\u0062转换成字符b,最终标签对应的键是foobarb——和JSON里的键完全不匹配,所以无法映射到x字段。
如何解决?
根据你的JSON实际格式,选择对应方案:
方案1:JSON键确实是字面的foobar\u0062
需要在结构体标签里转义反斜杠,让Go编译器保留\u0062的原样。修改标签为json:"foobar\\u0062":
type MyStruct struct { x string `json:"foobar\\u0062"` Name string `json:"Username"` }
此时标签最终会被解析为foobar\u0062,和JSON的键完全匹配,就能正常映射值。
方案2:JSON键实际是foobarb(\u0062是JSON的Unicode转义)
这是更常见的场景——JSON规范里的\u0062是Unicode转义,会被json.Unmarshal解析为字符b,实际键是foobarb。此时需要修正JSON数据的定义:
- 把反引号改为双引号,让Go解析JSON字符串时自动转义
\u0062:
data := []byte("{\"foobar\u0062\": \"some value\", \"Username\": \"xxx\"}")
- 或者直接在反引号字符串里把
\u0062替换为字符b:
data := []byte(`{"foobarb": "some value", "Username": "xxx"}`)
这时候结构体标签可以保留json:"foobar\u0062"(Go会转成foobarb),或者直接写json:"foobarb",都能正常映射。
拓展:处理包含实际Unicode字符的键
如果你的JSON键是类似foo\u00a0(对应不换行空格)这类实际的Unicode字符,直接在结构体标签里写对应的Unicode转义即可,比如json:"foo\u00a0"。Go会把标签里的转义解析为对应字符,json.Unmarshal解析JSON时也会把\u00a0转成相同字符,两者就能匹配。
内容的提问来源于stack exchange,提问作者glacier
相关产品推荐
相关产品推荐

