2017-08-16 45 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

相關問題