使用自定义标记处理解组 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中文网其他相关文章!