You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:16:03