2013-10-28 18 views

Antwort

34

Im Paket encoding/json ist kein Tag vorhanden, das ein Feld auf "erforderlich" setzt. Sie müssen entweder Ihre eigene MarshalJSON()-Methode schreiben oder eine Nachprüfung nach fehlenden Feldern durchführen.

für fehlende Felder zu überprüfen, müssen Sie Zeiger verwenden, um zwischen fehlenden/null und Null-Werte zu unterscheiden:

type JsonStruct struct { 
    String *string 
    Number *float64 
} 

Vollarbeitsbeispiel:

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

Oder Sie könnten einfach nach dem Standardwert suchen, der für die meisten Fälle ausreichen könnte (es sei denn, Sie arbeiten mit Zahlen). – Matt3o12

+0

Aber was, wenn der Wert des "erforderlichen Feldes" der Standardwert ist? – AJPennster

+0

Wenn das erforderliche Feld einer Zahl 0 sein kann und Sie auch überprüfen müssen, ob es angegeben ist, verwenden Sie stattdessen string's, um zu überprüfen, dass keine Eingabe erfolgt, und konvertieren Sie dann die Zeichenfolge in eine Zahl nach. – Zanven

2

Sie können das Unmarshalling auch für einen bestimmten Typ überschreiben (also ein erforderliches Feld, das in einigen Json-Layern verborgen ist), ohne das Feld zu einem Zeiger zu machen.

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                           
}