我怎么知道该字段被设置为null?

时间:2017-08-16 19:24:29

标签: json go

如果json中的字段包含null值,我想输出错误。我该怎么做?我试过" encoding / json"。也许我需要另一个图书馆。

代码示例:

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type Item struct {
    Value  *int
}


func main() {
    var jsonBlob = `[
        {},
        {"Value": null},
        {"Value": 0},
        {"Value": 1}
    ]`
    var items []Item

    err := json.NewDecoder(strings.NewReader(jsonBlob)).Decode(&items)
    if err != nil {
        fmt.Println("error:", err)
    }
    for _, a := range items {
        if a.Value != nil {
            fmt.Println(*a.Value)
        } else {
            fmt.Println(a.Value)
        }
    }
}

我得到了:

<nil>
<nil>
0
1

我想:

<nil>
<error>
0
1

请帮忙。非常感谢!

1 个答案:

答案 0 :(得分:4)

如果要控制类型的解组方式,可以实现json.Unmarshaler

由于地图允许您区分未设置值和null值,因此首先解组为通用map[string]interface{}将允许您在不标记JSON的情况下检查值。

type Item struct {
    Value *int
}


func (i *Item) UnmarshalJSON(b []byte) error {
    tmp := make(map[string]interface{})

    err := json.Unmarshal(b, &tmp)
    if err != nil {
        return err
    }

    val, ok := tmp["Value"]
    if ok && val == nil {
        return errors.New("Value cannot be nil")

    }
    if !ok {
        return nil
    }

    f, ok := val.(float64)
    if !ok {
        return fmt.Errorf("unexpected type %T for Value", val)
    }

    n := int(f)
    i.Value = &n
    return nil
}

https://play.golang.org/p/MNDsQpfEJA