2013-10-28 3 views

ответ

34

В пакете encoding/json нет тега, который устанавливает поле "required". Вам придется либо написать свой собственный метод 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

Вы также можете переопределить unmarshalling для определенного типа (так что требуемое поле, захороненное в нескольких слоях 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                           
}              
Смежные вопросы