2014-04-23 6 views
8

मैं इस structउचित तरीके से एक struct करने के लिए एक json.RawMessage कन्वर्ट करने के लिए क्या है?

type SyncInfo struct { 
    Target string 
} 

अब मैं ElasticSearch से कुछ json डेटा को क्वेरी की है। Sourcejson.RawMessage प्रकार का है। सभी मैं चाहता हूँ मेरी SyncInfo जो मैं के लिए चर mySyncInfo बनाया source मैप करने के लिए है।

मैं भी पता लगा है कि कैसे करना है ... लेकिन यह अजीब लगता है। मैं पहली बार MarshalJSON() फोन एक []byte पाने के लिए और उसके बाद json.Unmarshal() जो एक []byte और मेरे struct करने के लिए एक सूचक लेता है कि खाते हैं।

यह ठीक काम करता है, लेकिन यह लगता है जैसे मैं एक अतिरिक्त हॉप कर रहा हूँ। मैं कुछ याद आ रही है या कि इच्छित रास्ता एक struct करने के लिए एक json.RawMessage से प्राप्त करने के लिए है?

var mySyncInfo SyncInfo 

jsonStr, _ := out.Hits.Hits[0].Source.MarshalJSON() 
json.Unmarshal(jsonStr, &mySyncInfo) 

fmt.Print(mySyncInfo.Target) 

उत्तर

13

के रूप में कहा, json.RawMessage के अंतर्निहित प्रकार []byte है, तो आप json.Unmarshal करने के लिए डेटा पैरामीटर के रूप में एक json.RawMessage उपयोग कर सकते हैं।

हालांकि, आपकी समस्या यह है कि आपके पास एक सूचक (*json.RawMessage) है और कोई मान नहीं है। आपको बस इतना करना है यह भिन्नता के लिए है:

err := json.Unmarshal(*out.Hits.Hits[0].Source, &mySyncInfo) 

कार्य उदाहरण:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type SyncInfo struct { 
    Target string 
} 

func main() { 
    data := []byte(`{"target": "localhost"}`) 
    Source := (*json.RawMessage)(&data) 

    var mySyncInfo SyncInfo 
    // Notice the dereferencing asterisk * 
    err := json.Unmarshal(*Source, &mySyncInfo) 
    if err != nil { 
     panic(err) 
    } 

    fmt.Printf("%+v\n", mySyncInfo) 
} 

आउटपुट:

{Target:localhost} 

खेल का मैदान:http://play.golang.org/p/J8R3Qrjrzx

+2

tada! आप आदमी हो! यह गो के साथ मेरा पहला दिन है ;-) – Christoph

+0

आपका स्वागत है :) और खुश कोडिंग जाओ! – ANisus

2

json.RawMessage वास्तव में बाइट्स का एक टुकड़ा है। आप सीधे json.Unmarshal में सीधे खिलाने के लिए है, तो तरह सक्षम होना चाहिए:

json.Unmarshal(out.Hits.Hits[0].Source, &mySyncInfo) 

इसके अलावा, कुछ हद तक असंबंधित, लेकिन json.Unmarshal एक त्रुटि लौट सकते हैं और आपको लगता है कि हैंडल करना चाहते हैं।

err := json.Unmarshal(*out.Hits.Hits[0].Source, &mySyncInfo) 
if err != nil { 
    // Handle 
} 
+0

यह मैं एक प्रकार की त्रुटि देता है 'argument' – Christoph

+0

आह समारोह में के रूप में प्रकार [] बाइट उपयोग नहीं कर सकते hit.Source (प्रकार * json.RawMessage), हम मूल्य के संदर्भ के लिए सीधे तो जरूरत है। Json.RawMessage के बजाय * json.RawMessage गुजरने का प्रयास करें। मैंने इस परिवर्तन को दर्शाने के लिए उत्तर में उदाहरण अपडेट किया है। –

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

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