2013-08-17 6 views
5

Here is the codeunmarshal परिलक्षित मूल्य

package main 

import (
    "fmt" 

    "encoding/json" 
    "reflect" 
) 

var (
    datajson []byte 
    //ref mapp 
) 

type mapp map[string]reflect.Type 

type User struct { 
    Name string 
    //Type map[string]reflect.Type 
} 

func MustJSONEncode(i interface{}) []byte { 
    result, err := json.Marshal(i) 
    if err != nil { 
     panic(err) 
    } 
    return result 
} 
func MustJSONDecode(b []byte, i interface{}) { 
    err := json.Unmarshal(b, i) 
    if err != nil { 
     panic(err) 
    } 

} 
func Store(a interface{}) { 
    datajson = MustJSONEncode(a) 
    //fmt.Println(datajson) 
} 

func Get(a []byte, b interface{}) { 
    objType := reflect.TypeOf(b).Elem() 
obj := reflect.New(objType) 
//fmt.Println(obj) 
MustJSONDecode(a, &obj) 
fmt.Printf("%s", obj) 
    } 

func main() { 

    dummy := &User{} 
    david := User{Name: "DavidMahon"} 

    Store(david) 
    Get(datajson, dummy) 

} 

प्राप्त समारोह

func Get(a []byte, b interface{}) { 
    objType := reflect.TypeOf(b).Elem() 
obj := reflect.New(objType) 
//fmt.Println(obj) 
MustJSONDecode(a, &obj) 
fmt.Printf("%s", obj) 
    } 

में पर मैं अंतर्निहित ऑब्जेक्ट प्रकार में json unmarshal में असमर्थ हूँ।

क्या गलत है? मैं यहाँ फंस गया हूँ। कुछ बहुत ही सरल अभी तक पता लगाना मुश्किल है।

धन्यवाद

अद्यतन :: इस समस्या का लक्ष्य प्रकार प्राप्त समारोह में पारित की एक पूरी तरह से बनाई वस्तु नहीं निकाला जा सकता है।

नीचे टिप्पणी पर निक द्वारा वर्णित दृष्टिकोण मुझे वास्तविक वस्तु नहीं मिला है जिसे मैंने पहले ही कोशिश की है। मैं वैसे भी हालांकि मैं वास्तविक वस्तु वापस बस डेटा की जरूरत नहीं है इस

func Get(a []byte) { 
    var f interface{} 

    //buf := bytes.NewBuffer(a) 
    //v := buf.String() 
    //usr := &User{} 

    MustJSONDecode(a, &f) 
    fmt.Printf("\n %v \n", f) 
} 

की तरह एक नक्शे में डेटा पुनः प्राप्त कर सकते हैं (यहां तक ​​कि जब वस्तु पुनरावर्ती वस्तुओं के नीचे है)। user := &User{"SomeName"} की तरह कुछ जहां मुझे user Unmarshall से वापस ऑब्जेक्ट की आवश्यकता है। यह चाल कहीं प्रतिबिंब में है लेकिन यह नहीं पता कि कैसे।

+0

प्रतिबिंब ऐसा नहीं करेगा जो आपको लगता है कि ऐसा होगा। आप इसका उपयोग करके एक मनमानी वस्तु का निर्माण नहीं कर सकते हैं। आप शायद प्रतिबिंबित और असुरक्षित का उपयोग करके कुछ एकत्र कर सकते हैं लेकिन वास्तव में आपको उस पर पुनर्विचार करना चाहिए जो आप करने की कोशिश कर रहे हैं। –

+0

धन्यवाद मैं इस धागे को बंद कर रहा हूं। समय लेने के लिए धन्यवाद। आपके उत्तरों को +1 किया – Minty

उत्तर

3

मैं तुम क्यों ऐसा करना चाहते हैं के रूप में उलझन में हूँ, लेकिन यहाँ ठीक करने का तरीका यह

func Get(a []byte, b interface{}) { 
    objType := reflect.TypeOf(b).Elem() 
    obj := reflect.New(objType).Interface() 
    //fmt.Println(obj) 
    MustJSONDecode(a, &obj) 
    fmt.Printf("obj = %#v\n", obj) 
} 

नोट Interface() करने के लिए कॉल है।

Playground link

मुझे ऐसा लगता है कि आप मुसीबत का एक बहुत कुछ करने जा रहे हैं एक खाली &User बनाने के लिए जब आप पहले से ही b में से एक है, जैसे

func Get(a []byte, b interface{}) { 
    MustJSONDecode(a, &b) 
    fmt.Printf("obj = %#v\n", b) 
} 

लेकिन मेरा अनुमान है कि वहाँ है इस योजना के लिए कुछ और जो यहां स्पष्ट नहीं है!

+0

धन्यवाद लेकिन मैंने पहले ही थिसट चाल की कोशिश की है।इसके साथ दो मुश्किलें हैं। – Minty

+0

1. यह रिकर्सिव ऑब्जेक्ट प्रकारों पर काम नहीं करेगा। यह ऑब्जेक्ट्स और ऑब्जेक्ट्स के अंदर ऑब्जेक्ट्स है। लौटाया गया डेटा मज़ेदार तरीके से भेजे गए प्रकार का ऑब्जेक्ट नहीं है। मुश्किल हिस्सा है। मैंने इसे स्पष्ट करने के लिए अपना प्रश्न अपडेट किया। – Minty

+0

क्या वस्तु वापस आ गई? आप एक वस्तु वापस नहीं करते हैं। बी जो पहले से ही सही प्रकार है, उसे MustJSONDecode पर कॉल द्वारा पॉप्युलेट किया जाता है। –

1

reflect.New(objType)reflect.Value देता है जो आपके द्वारा पारित इंटरफ़ेस की बात नहीं है। Value के लिए दस्तावेज़ों के अनुसार यह केवल अप्रयुक्त फ़ील्ड के साथ एक संरचना है। जेसन पैकेज अप्रत्याशित फ़ील्ड के साथ काम नहीं कर सकता है। चूंकि यह आपके द्वारा पारित वही ऑब्जेक्ट नहीं है और यह जेसन एन्कोडेबल/डिकोडेबल भी नहीं है, जेसन पैकेज विफल हो जाएगा।

आपको प्रतिबिंबित पैकेज का उपयोग करने के दौरान शायद Laws of Reflection आलेख उपयोगी होगा।

+0

संदर्भ के लिए धन्यवाद। मैंने तीन बार पढ़ा लेकिन एक विचार मैंने देखा कि यह लेख (जो बीटीडब्ल्यू बहुत अंतरंग है) अन्य वस्तुओं से वस्तुओं को बनाने के बारे में बात नहीं करता है। लेखक धोखा दे सकता है कि डेवलपर विवेकाधिकार के एक हिस्से के रूप में। – Minty

+1

आप वास्तव में किसी विशेष प्रकार की वस्तु को वर्णन करने के तरीके को प्रतिबिंबित करने के लिए प्रतिबिंबित नहीं कर सकते हैं। आप प्रतिबिंबित करने के लिए प्रतिबिंबित कर सकते हैं * यदि * एक वस्तु किसी विशेष प्रकार का है लेकिन मनमानी प्रकार का निर्माण नहीं करना है। –

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