首页 > 后端开发 > Golang > 如何在 Go 中为派生标量类型实现 UnmarshalJSON?

如何在 Go 中为派生标量类型实现 UnmarshalJSON?

Patricia Arquette
发布: 2024-11-26 18:41:16
原创
410 人浏览过

How to Implement UnmarshalJSON for Derived Scalar Types in Go?

Go 中派生标量的 UnmarshalJSON 实现

问题:
转换子类型整型常量的自定义类型转换为字符串,反之亦然,需要自动解组 JSON 字符串。这是具有挑战性的,因为 UnmarshalJSON 不提供在不使用结构体的情况下修改标量值的方法。

解决方案:
要为派生标量类型实现 UnmarshalJSON,请考虑以下步骤:

使用指针接收器:
使用 UnmarshalJSON 方法的指针接收器来修改接收器的值。

解组为字符串:
将 JSON 文本解组为字符串纯字符串,删除所有 JSON 引用。

查找和设置值:
使用Lookup函数根据字符串值检索对应的PersonID。将结果分配给接收者。

示例:

func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}
登录后复制

代码示例:

package main

import (
    "encoding/json"
    "fmt"
)

type PersonID int

const (
    Bob PersonID = iota
    Jane
    Ralph
    Nobody = -1
)

var nameMap = map[string]PersonID{
    "Bob":    Bob,
    "Jane":   Jane,
    "Ralph":  Ralph,
    "Nobody": Nobody,
}

var idMap = map[PersonID]string{
    Bob:    "Bob",
    Jane:   "Jane",
    Ralph:  "Ralph",
    Nobody: "Nobody",
}

func (intValue PersonID) Name() string {
    return idMap[intValue]
}

func Lookup(name string) PersonID {
    return nameMap[name]
}

func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}

type MyType struct {
    Person   PersonID `json: "person"`
    Count    int      `json: "count"`
    Greeting string   `json: "greeting"`
}

func main() {
    var m MyType
    if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
        fmt.Println(err)
    } else {
        for i := 0; i < m.Count; i++ {
            fmt.Println(m.Greeting, m.Person.Name())
        }
    }
}
登录后复制

输出:

Hello Ralph
Hello Ralph
Hello Ralph
Hello Ralph
登录后复制

以上是如何在 Go 中为派生标量类型实现 UnmarshalJSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板