首页 >后端开发 >Golang >如何自定义 JSON 解组来处理不明确的布尔值?

如何自定义 JSON 解组来处理不明确的布尔值?

Barbara Streisand
Barbara Streisand原创
2024-11-29 05:49:09175浏览

How Can I Customize JSON Unmarshaling to Handle Ambiguous Boolean Values?

在 JSON 解组中扩展布尔解析选项

当映射服务输出模糊布尔类型和其他值之间的界限时,更包容的 JSON解析器变得至关重要。内置的encoding/json unmarshal 函数在这方面存在不足,促使人们寻找允许的解析替代方案。

一种方法是为所需类型创建自定义 UnmarshalJSON 函数。该函数可以定义自定义解析规则来处理不明确的布尔值。例如,考虑以下 ConvertibleBoolean 类型:

type ConvertibleBoolean bool

func (bit *ConvertibleBoolean) UnmarshalJSON(data []byte) error {
    asString := string(data)
    if asString == "1" || asString == "true" {
        *bit = true
    } else if asString == "0" || asString == "false" {
        *bit = false
    } else {
        return errors.New(fmt.Sprintf("Boolean unmarshal error: invalid input %s", asString))
    }
    return nil
}

在此函数中,字符串“1”和“true”被映射为 true,而“0”和“false”被解析为 false。超出这些范围的值会触发错误。

要利用此自定义布尔解析,请将 json 标签应用于目标字段。例如:

type MyType struct {
    AsBoolean ConvertibleBoolean `json:"field1"`
    AlsoBoolean ConvertibleBoolean `json:"field2"`
}

使用这些自定义解析规则,JSON 输入:

{
    "field1": true,
    "field2": 1
}

将生成以下未编组的结构:

obj := MyType{}
json_err := json.Unmarshal([]byte(input_json), &obj)
fmt.Printf("%v\n", obj.AsBoolean) //"true"
fmt.Printf("%v\n", obj.AlsoBoolean) //"true"

通过利用自定义解析函数,您可以灵活地进行 JSON 解组,从而可以将不明确的布尔值处理为需要。

以上是如何自定义 JSON 解组来处理不明确的布尔值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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