在我的 Go 应用程序中,我正在处理(结构的)JSON 编组和解组,我需要区分三种场景:
我尝试使用指针,但仍然无法涵盖所有三种场景。
在 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。 请务必根据您的特定结构和字段类型自定义此示例。 这种方法解决了上面提到的三种情况。