2013-10-28 8 views
28

गोलांग में अनारक्षित होने पर जेसन में कोई फ़ील्ड नहीं मिला तो क्या कोई त्रुटि उत्पन्न करना संभव है? मैं इसे दस्तावेज में नहीं मिला। क्या कोई टैग है जो फ़ील्ड को आवश्यकतानुसार निर्दिष्ट करता है?गोलांग में Unmarshaling जेसन: आवश्यक फ़ील्ड?

उत्तर

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

फ़ील्ड मौजूद जांचने के लिए, आप क्रम में संकेत का उपयोग करने के लापता/बातिल और शून्य मान के बीच भेद करना होगा

आप फ़ील्ड को एक पॉइंटर बनाने के बिना एक विशिष्ट प्रकार (इसलिए कुछ जसन परतों में दफन किए गए एक आवश्यक फ़ील्ड) के लिए unmarshalling को ओवरराइड भी कर सकते हैं।

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                           
}              
संबंधित मुद्दे