2013-11-20 3 views
10

मैं कुछ जेसन को अनमर्शल करने की कोशिश कर रहा हूं ताकि एक नेस्टेड ऑब्जेक्ट पार्स नहीं किया जा सके लेकिन सिर्फ string या []byte के रूप में माना जाता है।json.Unmarshal नेस्टेड ऑब्जेक्ट स्ट्रिंग या [] बाइट

{ 
    "id" : 15, 
    "foo" : { "foo": 123, "bar": "baz" } 
} 

Unmarshaled में:

type Bar struct { 
    Id int64 `json:"id"` 
    Foo []byte `json:"foo"` 
} 

मैं निम्न त्रुटि:

json: cannot unmarshal object into Go value of type []uint8 

playground demo

+1

'का प्रयोग क्यों न नक्शा [ स्ट्रिंग] इंटरफ़ेस {} '? इसका सही तरीके से पुनः मार्शलिंग का लाभ भी है। –

उत्तर

19

मुझे लगता है कि आप जो खोज रहे हैं वह RawMessageencoding/json पैकेज में टाइप करें।

प्रलेखन राज्यों:

type RawMessage []byte

RawMessage is a raw encoded JSON object. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding.

यहाँ RawMessage का उपयोग करने का एक काम उदाहरण है:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

var jsonStr = []byte(`{ 
    "id" : 15, 
    "foo" : { "foo": 123, "bar": "baz" } 
}`) 

type Bar struct { 
    Id int64   `json:"id"` 
    Foo json.RawMessage `json:"foo"` 
} 

func main() { 
    var bar Bar 

    err := json.Unmarshal(jsonStr, &bar) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Printf("%+v\n", bar) 
} 

आउटपुट:

{Id:15 Foo:[123 32 34 102 111 111 34 58 32 49 50 51 44 32 34 98 97 114 34 58 32 34 98 97 122 34 32 125]}

Playground

+0

वही है जो मैं चाहता था कि –

+2

आपको बताया गया हो;)। मदद करने में खुशी! – ANisus

2

एक प्रकार परिभाषित

तो मैं निम्नलिखित प्राप्त करना चाहते हैं जो एच Unmarshaler इंटरफ़ेस लागू करता है आपको []byte पर पार्स किया जा रहा है।

type Prefs []byte 

func (p *Prefs) UnmarshalJSON(b []byte) error { 
    *p = make(Prefs, len(b)) 
    copy(*p, b) 
    return nil 
} 

playground demo

2

फू प्रकार नक्शा दिया गया है [स्ट्रिंग] स्ट्रिंग तो फू सही ढंग से परिभाषित करते हैं:

type Bar struct { 
    id int64 
    Foo map[string]string 
} 

सोचो कि बेहतर

+1

तो '[] बाइट्स' -> 'उमरशाल' -> 'मानचित्र [स्ट्रिंग] इंटरफेस {}' ->' मार्शल '->' स्ट्रिंग' ... क्यों? –

-1

काम करेगा मैं संवारता 'का एक सा होने के बाद हमने पाया है कि आपके खेल के मैदान डेमो में सबसे बड़ी समस्या जेसन की टाइपिंग को [] बाइट में है। यह देखने के लिए कि मेरा क्या मतलब है, इस खेल का मैदान देखें: http://play.golang.org/p/M0706KCZbh

यदि आप इसे चलाते हैं, तो आप टाइपकास्ट स्लाइस के बीच [] बाइट देखेंगे और मार्शल स्लाइस 'Prefs' के बिंदु के आसपास भिन्न होगा। चर।

json struct

[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 34 101 121 65 105 90 से मार्शल ...

टाइपकास्ट [] बाइट

[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 123 34 102 111 111 34 ...

मैंने सफेद जगह को जितना संभव हो उतना लाइन बनाने की कोशिश करने के लिए हटा दिया है। इसका मुख्य अधिग्रहण यह है कि टाइपकास्टिंग जेसन के माध्यम से डेटा चलाने के समान परिणाम उत्पन्न नहीं करता है। मार्शल विधि और इस काम को करने के लिए आपको जेसन पैकेज को पहचानने की अनौपचारिकता को संभालने के लिए एक कस्टम प्रकार की आवश्यकता होगी।

+0

मुझे लगता है कि यह उदाहरण बेहतर है कि आप क्या कह रहे हैं http://play.golang.org/p/1XFn6zqME8। हालांकि, यह वास्तव में सवाल का जवाब नहीं देता है। –

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