2013-10-28 3 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

이 필드를 누락 확인하려면 , 당신은/누락 된 널 (null)과 0 값을 구분하기 위해 포인터를 사용해야합니다

필드를 포인터로 만들지 않고도 특정 유형에 대한 언 마샬링을 재정의 할 수 있습니다 (따라서 몇 개의 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                           
}              
관련 문제