首页 > 后端开发 > Golang > 正文

如何使用字符串表示的自定义标记处理解组 JSON?

Linda Hamilton
发布: 2024-10-31 08:37:29
原创
343 人浏览过

How to Unmarshal JSON with Custom Tag Handling for String Representation?

使用自定义标记处理解组 JSON

尝试将 JSON 解组到结构中时,可能需要以不同方式处理具有自定义标记的字段。本文探讨了一个问题,即结构体中的字段有一个标记,指示应将其解组为字符串。

问题:

考虑一个 JSON 字符串和一个相应的结构:

<code class="json">{
  "I": 3,
  "S": {
    "phone": {
      "sales": "2223334444"
    }
  }
}</code>
登录后复制
<code class="go">type A struct {
  I int64
  S string `sql:"type:json"`
}</code>
登录后复制

目标是将“S”字段解组为字符串,而不是结构。

解决方案:

使用 Marshaler/Unmarshaler 接口:

Go 提供了一种通过实现自定义类型的 Marshaler 和 Unmarshaler 接口来覆盖默认 JSON 编组和解组行为的方法。在本例中,创建一个名为 RawString 的新类型并实现以下函数:

<code class="go">type RawString string

func (m *RawString) MarshalJSON() ([]byte, error) {
  return []byte(*m), nil
}

func (m *RawString) UnmarshalJSON(data []byte) error {
  if m == nil {
    return errors.New("RawString: UnmarshalJSON on nil pointer")
  }
  *m += RawString(data)
  return nil
}</code>
登录后复制

应用于结构体:

修改 A 结构体以使用 RawString 类型对于“S”字段:

<code class="go">type A struct {
  I int64
  S RawString `sql:"type:json"`
}</code>
登录后复制

通过此实现,当 JSON 被解组为 A 结构时,“S”字段将被解组为字符串,保留其原始 JSON 表示形式。

用法示例:

<code class="go">const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

func main() {
  a := A{}
  err := json.Unmarshal([]byte(data), &a)
  if err != nil {
    log.Fatal("Unmarshal failed:", err)
  }
  fmt.Println("Done", a)
}</code>
登录后复制

输出:

<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>
登录后复制

以上是如何使用字符串表示的自定义标记处理解组 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!