2017-08-16 44 views
1

如果json中的字段包含null值,我想输出一个错误。我该怎么做?我尝试过“编码/ 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 

请帮助。非常感谢!

+0

为什么会' “值”:null'导致一个错误? 'null'对指针字段来说是一个完全有效的值,并且正确地反序列化为'nil',这是Go的'null'。 – Adrian

+0

我在写rest-api。这是要求之一。 – Ilya

+0

@Ilya:对于API来说这似乎是一个奇怪的要求,null和unset通常是相同的东西。 – JimB

回答

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

+0

我不认为这是有效的,根据问题,他们希望根据问题中的“我想要”部分将零值设置为“零”而不是“空值”以导致错误。 – Adrian

+0

@阿德里安:啊,谢谢。我会照顾的 – JimB

+0

@Ilya:我已经更新了一个地图示例,它显示了如何区分“未设置”和“空” – JimB

相关问题