首页  >  文章  >  后端开发  >  如何将 JSON 解组到带有“json”标记字段的结构中?

如何将 JSON 解组到带有“json”标记字段的结构中?

Linda Hamilton
Linda Hamilton原创
2024-11-02 00:02:02176浏览

How to Unmarshal JSON into a Struct with a Field Tagged with

将 JSON 解组到带有标记为“json”的字段的结构中

尝试将 JSON 解组到结构中时,您可能会遇到特定字段具有以下情况的情况:一个“json”标签。此标记需要特殊处理,以确保 JSON 数据正确转换为结构中所需的字符串格式。

在提供的示例中,结构 A 有一个用 sql:"type:json" 标记的字段 S。目标是将提供的 JSON 数据中的“S”值解组为 A 结构中的字符串格式。

最初,您可能考虑使用反射来检查字段标记是否包含字符串“json” ",然后将 JSON 数据作为字符串解组到该字段中。然而,一种更高效、更优雅的方法是使用 Go 的标准库功能。

使用自定义类型和编组/解组方法

实现此目的的一种方法是定义自定义类型 RawString 并实现其 MarshalJSON 和 UnmarshalJSON 方法。这些方法提供了一种分别控制 JSON 数据编码和解码方式的方法。

在此示例中,RawString 类型包装字符串值。 MarshalJSON 方法将字符串值作为字节切片返回,而 UnmarshalJSON 方法将接收到的数据附加到现有的 RawString。

编组和解组 JSON

下一步是定义 A struct,其中包括 I 字段(64 位整数)和 RawString 类型的 S 字段。

使用这些自定义类型和方法,您可以将提供的 JSON 数据解组到 A 结构中。下面的 Go 代码演示了这一点:

<code class="go">import (
    "encoding/json"
    "fmt"
    "log"
)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

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

通过使用这种方法,您可以有效地将 JSON 数据解组到带有标记为“json”的字段的结构体中,并保留其原始字符串格式。

以上是如何将 JSON 解组到带有“json”标记字段的结构中?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn