2013-10-28 10 views

答えて

34

encoding/jsonパッケージにフィールドが「必須」に設定されているタグはありません。あなた自身のMarshalJSON()メソッドを書かなければならないか、欠落しているフィールドのポストチェックをしなければなりません。不足している分野をチェックするために

、あなたが/不足している、ヌルとゼロ値とを区別するためにポインタを使用する必要があります:

type JsonStruct struct { 
    String *string 
    Number *float64 
} 

全作業例:

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type JsonStruct struct { 
    String *string 
    Number *float64 
} 

var rawJson = []byte(`{ 
    "string":"We do not provide a number" 
}`) 


func main() { 
    var s *JsonStruct 
    err := json.Unmarshal(rawJson, &s) 
    if err != nil { 
     panic(err) 
    } 

    if s.String == nil { 
     panic("String is missing or null!") 
    } 

    if s.Number == nil { 
     panic("Number is missing or null!") 
    } 

    fmt.Printf("String: %s Number: %f\n", *s.String, *s.Number) 
} 

Playground

+1

または、ほとんどの場合(数字を使用している場合を除き)、デフォルト値で十分かもしれません。 – Matt3o12

+0

"必須フィールド"の値がデフォルト値の場合はどうなりますか? – AJPennster

+0

数字の必須フィールドが0になる可能性がある場合は、その文字列が存在するかどうかを確認し、文字列を使用して入力がないかどうかを確認してから文字列を数字に変換します。 – Zanven

2

フィールドをポインタにする必要なしに、特定のタイプのアンマーシャリングをオーバーライドすることもできます(いくつかのjsonレイヤに埋め込まれた必須フィールド)。

type EnumItem struct {                        
    Named                           
    Value string                         
}                             

func (item *EnumItem) UnmarshalJSON(data []byte) (err error) {              
    required := struct {                       
     Value *string `json:"value"`                    
    }{}                           
    all := struct {                        
     Named                          
     Value string `json:"value"`                    
    }{}                           
    err = json.Unmarshal(data, &required)                   
    if err != nil {                        
     return                          
    } else if required.Value == nil {                    
     err = fmt.Errorf("Required field for EnumItem missing")             
    } else {                          
     err = json.Unmarshal(data, &all)                   
     item.Named = all.Named                      
     item.Value = all.Value                      
    }                            
    return                           
}              
関連する問題