如何区分 Go 中 JSON 编组/解组中不存在的字段、空字段和设置值?

问题描述 投票:0回答:1

在我的 Go 应用程序中,我正在处理(结构的)JSON 编组和解组,我需要区分三种场景:

  1. JSON 中不存在字段。
  2. JSON 中存在一个字段,但显式设置为 null。
  3. JSON 中存在一个字段并保存特定值。

我尝试使用指针,但仍然无法涵盖所有三种场景。

json go encoding marshalling unmarshalling
1个回答
0
投票

在 Go 中,您可以使用带有自定义编组和解组方法的 JSON 包来处理这些场景。 一种常见的方法是使用指向可选字段的指针和 json.Unmarshaler 接口的自定义实现来处理不同的情况。 下面是一个示例,展示了如何实现此目的:

包主

导入( “编码/json” “FMMT” )

类型 MyStruct 结构 { 字段 1 *字符串

json:"field1,omitempty"
字段2 *int
json:"field2,omitempty"
Field3 字符串
json:"field3"
}

// UnmarshalJSON 自定义实现 func (m *MyStruct) UnmarshalJSON(data []byte) 错误 { 类型别名 MyStruct 辅助 := &struct { 字段 1 *字符串

json:"field1"
字段2 *int
json:"field2"
*别名 }{ 别名:(*别名)(m), }

if err := json.Unmarshal(data, &aux); err != nil {
    return err
}

if aux.Field1 == nil {
    m.Field1 = new(string)
}
return nil

}

函数主(){ // 不同场景下的JSON数据 jsonData1 := []字节(

{"field2": null, "field3": "value3"}
) jsonData2 := []字节(
{"field1": null, "field2": 42, "field3": "value3"}
) jsonData3 := []字节(
{"field1": "value1", "field2": 42, "field3": "value3"}
)

// Unmarshal JSON data into MyStruct instances
var myStruct1 MyStruct
var myStruct2 MyStruct
var myStruct3 MyStruct

err1 := json.Unmarshal(jsonData1, &myStruct1)
err2 := json.Unmarshal(jsonData2, &myStruct2)
err3 := json.Unmarshal(jsonData3, &myStruct3)

// Check errors and print results
if err1 != nil {
    fmt.Println("Error unmarshalling jsonData1:", err1)
} else {
    fmt.Println("Unmarshalled jsonData1:", myStruct1)
}

if err2 != nil {
    fmt.Println("Error unmarshalling jsonData2:", err2)
} else {
    fmt.Println("Unmarshalled jsonData2:", myStruct2)
}

if err3 != nil {
    fmt.Println("Error unmarshalling jsonData3:", err3)
} else {
    fmt.Println("Unmarshalled jsonData3:", myStruct3)
}

} 此示例使用 UnmarshalJSON 方法来自定义解组过程。 检查 JSON 数据中是否存在某个字段、是否显式设置为 null 或具有特定值。 Field1 是一个指针,因此如果在 JSON 中显式设置为 null,则它可以为 null。 请务必根据您的特定结构和字段类型自定义此示例。 这种方法解决了上面提到的三种情况。

© www.soinside.com 2019 - 2024. All rights reserved.