2013-06-05 6 views
10

मैं निम्नलिखित JSON है, और मुझे वर्ग की सरणी में यह पार्स करने के लिए करना चाहते हैं:गो भाषा में, मैं ऑब्जेक्ट की सरणी के लिए json unmarshal कैसे करूं?

{ 
    "1001": {"level":10, "monster-id": 1001, "skill-level": 1, "aimer-id": 301} 
    "1002": {"level":12, "monster-id": 1002, "skill-level": 1, "aimer-id": 302} 
    "1003": {"level":16, "monster-id": 1003, "skill-level": 2, "aimer-id": 303} 
} 

यहाँ मुझे क्या करना कोशिश कर रहा हूँ है, लेकिन विफल रहा:

type Monster struct { 
    MonsterId int32 
    Level  int32 
    SkillLevel int32 
    AimerId int32 
} 


type MonsterCollection struct { 
    Pool map[string]Monster 
} 

func (mc *MonsterCollection) FromJson(jsonStr string) { 
    var data interface{} 
    b := []byte(jsonStr) 
    err := json.Unmarshal(b, &data) 
    if err != nil { 
     return 
    } 

    m := data.(map[string]interface{}) 

    i := 0 
    for k, v := range m { 

     monster := new(Monster) 
     monster.Level = v["level"] 
     monster.MonsterId = v["monster-id"] 
     monster.SkillLevel = v["skill-level"] 
     monster.AimerId = v["aimer-id"] 

     mc.Pool[i] = monster 
     i++ 
    } 

} 

संकलक वी के बारे में शिकायत ["स्तर"] < < अमान्य ऑपरेशन। प्रकार इंटरफ़ेस की अनुक्रमणिका()।

उत्तर

18

इस कोड में इसमें कई त्रुटियां हैं। शुरू करने के लिए, जेसन वैध जेसन नहीं है। आप अपने शीर्ष स्तर की वस्तु में प्रमुख जोड़े के बीच कॉमा खो रहे हैं। मैं अल्पविराम का जोड़ा और बहुत आप के लिए यह मुद्रित:

{ 
    "1001":{ 
     "level":10, 
     "monster-id":1001, 
     "skill-level":1, 
     "aimer-id":301 
    }, 
    "1002":{ 
     "level":12, 
     "monster-id":1002, 
     "skill-level":1, 
     "aimer-id":302 
    }, 
    "1003":{ 
     "level":16, 
     "monster-id":1003, 
     "skill-level":2, 
     "aimer-id":303 
    } 
} 

आपका अगला समस्या (एक आप के बारे में पूछा) कि m := data.(map[string]interface{}) बनाता m एक map[string]interface{} है। इसका मतलब है कि जब आप इसे अपने रेंज लूप में v जैसे इंडेक्स करते हैं, तो टाइप interface{} है। आपको v.(map[string]interface{}) के साथ इसे फिर से लिखना होगा और फिर मानचित्र से पढ़ने पर हर बार जोर दें।


मैं भी ध्यान दें कि आप अगला प्रयास mc.Pool[i] = monster जब मैं एक पूर्णांक है और mc.Pool एक नक्शा [स्ट्रिंग] राक्षस है। एक int उस मानचित्र के लिए एक वैध कुंजी नहीं है।


आपका डेटा बहुत कठोर दिखता है, इसलिए मैं आपके लिए अधिकतर काम नहीं कर सकता। इसे एक नक्शा [स्ट्रिंग] इंटरफेस {} प्रदान करने के बजाय, आप इसे एक नक्शा [स्ट्रिंग] राक्षस प्रदान कर सकते हैं।

यहां एक त्वरित उदाहरण है। साथ ही साथ unmarshalling काम कैसे बदल रहा है, मैं भी एक त्रुटि वापसी जोड़ा। त्रुटि वापसी बग खोजने के लिए उपयोगी है। वह त्रुटि वापसी मुझे बताती है कि आपके पास अवैध जेसन था।

type Monster struct { 
    MonsterId int32 `json:"monster-id"` 
    Level  int32 `json:"level"` 
    SkillLevel int32 `json:"skill-level"` 
    AimerId int32 `json:"aimer-id"` 
} 

type MonsterCollection struct { 
    Pool map[string]Monster 
} 

func (mc *MonsterCollection) FromJson(jsonStr string) error { 
    var data = &mc.Pool 
    b := []byte(jsonStr) 
    return json.Unmarshal(b, data) 
} 

मैं एक काम उदाहरण तैनात goplay रहे हैं: http://play.golang.org/p/4EaasS2VLL

+0

वाह, बहुत बहुत धन्यवाद। मैं सिर्फ गो लांग सीख रहा हूं और अभी भी सीखने के लिए बहुत कुछ है। आपका जवाब बहुत उपयोगी है! – Nick

+0

एक और सवाल, क्या वैसे भी मैं मानचित्र की कुंजी के लिए int32 का उपयोग कर सकता हूं? मूल्य राक्षस-आईडी होना चाहिए, लेकिन जब मैं टाइप को int32 में बदलता हूं, तो नमूना कोड त्रुटि देता है। – Nick

+3

JSON कुंजी तार होना चाहिए। आपको जो करना है वह पहले 'मानचित्र [स्ट्रिंग] राक्षस' में पार्स है और फिर प्रत्येक राक्षस को' मानचित्र [int] राक्षस' पर कॉपी करें। –

संबंधित मुद्दे