2013-04-14 12 views
7

मैं एक वस्तु है कि एक कुछ इंटरफेस Entity की एक सरणी शामिल deserialise करना चाहते हैं की एक JSON सारणी:unmarshal विषम structs

type Result struct { 
    Foo int; 
    Bar []Entity; 
}; 

Entity एक अंतरफलक है कि struct प्रकार की एक संख्या से कार्यान्वित किया जाता है है। JSON डेटा प्रत्येक इकाई में "प्रकार" फ़ील्ड के साथ संरचना प्रकार की पहचान करता है। जैसे

{"type":"t1","field1":1} 
{"type":"t2","field2":2,"field3":3} 

मैं कैसे इस तरह से कि इसे सही ढंग से सरणी भरता में Result प्रकार deserialising के बारे में जाना होगा।

  1. Result पर UnmarshalJSON लागू: मैं क्या देख सकते हैं से, मैं करने के लिए है।
  2. पार्स एक []*json.RawMessage रूप Bar
  3. पार्स map[string]interface{} के रूप में प्रत्येक कच्चे संदेश।
  4. चेक "प्रकार" कच्चे संदेश में क्षेत्र।
  5. उपयुक्त प्रकार की एक संरचना बनाएँ।
  6. कच्चे संदेश फिर, अभी बनाया struct में इस समय पार्स।

यह सब बहुत कठिन और उबाऊ लगता है। क्या ऐसा करने के लिए इससे अच्छा तरीका है? या मैं इसे पीछे की ओर कर रहा हूं, और विषम वस्तुओं की एक सरणी को संभालने के लिए एक और कैननिक विधि है?

उत्तर

5

मुझे लगता है कि अपनी प्रक्रिया शायद की तुलना में यह हो गया है थोड़ा अधिक जटिल है, http://play.golang.org/p/0gahcMpuQc देखते हैं। एक नक्शा [स्ट्रिंग] इंटरफ़ेस {} आपके लिए बहुत कुछ संभाल लेगा।

वैकल्पिक रूप से, आप

struct EntityUnion { 
    Type string 
    // Fields from t1 
    // Fields from t2 
    // ... 
} 

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

+0

मैं एक "संघ" संरचना के साथ जा रहा था। यह गंदा महसूस किया, लेकिन अंत में मुक्त था। –