2013-11-20 21 views
10

Bazı jsonları Unmarshal kullanmaya çalışıyorum, böylece yuvalanmış bir nesne ayrıştırılamıyor, ancak sadece string veya []byte olarak kabul ediliyor.json.Unmarshal iç içe nesneye string veya [] byte

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

unmarshaled içine:

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

alıyorum aşağıdaki hata:

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

playground demo

+1

Neden [map 'kullanmayın dize] arayüzü {} '? Aynı zamanda doğru şekilde yeniden Marshalllama avantajına sahiptir. –

cevap

19

Aradığınızı düşünüyorum, encoding/json paketindeki RawMessage türüdür.

belgelerine durumları:

İşte

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 kullanarak bir çalışma örneğidir:

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) 
} 

Çıktı:

{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

tam olarak istediğim şey bu –

+2

Told you yani;). Yardım ettiğim için sevindim! – ANisus

2

bir tür tanımlama

Yani şu almak istiyorum yüklenebileceğini h Unmarshaler arabirimini uygular, []byte'un ayrıştırılmasını sağlar.

type Prefs []byte 

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

playground demo

2

Foo tipi bir haritasıdır [dize] dize yüzden doğru Foo tanımlayın:

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

işte ben müdahalesi biraz sonra daha iyi

+1

Yani [] bytes' -> 'Unmarshal' ->' [string] arayüzü {} '-> 'Marshal' ->' string'… neden? –

-1

çalışacak düşünün ve oyun alanınızdaki demoda en büyük problemin jsonun bir [] baytına yazılması olduğu ortaya çıktı. Bununla ne demek istediğimi görmek için, bu oyun alanına bir göz atın: http://play.golang.org/p/M0706KCZbh

Eğer çalıştırırsanız, typecast dilim ve sıralı dilim arasındaki [] bayt arasındaki farklar 'Prefs' noktasında farklıdır. değişken.

json

bayt

[] typecasting ... yapı

[34 105 100 123 34 58 49 53 44 34 112 114 101 102 115 34 58 34 101 121 65 105 90 sıraya

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

Mümkün olduğunca hizaya getirmek için beyaz alanı kaldırdım. Buradaki temel paket, yazım işleminin json.Marshal yöntemiyle verileri çalıştırmasıyla aynı sonuçları vermemesi ve bu çalışmayı yapabilmeniz için, json paketinin tanıyamayacağı şeylerin habersiz bir şekilde ele alınması için özel bir türe ihtiyacınız olacaktır.

+0

Bence bu örnek, http://play.golang.org/p/1XFn6zqME8 dediğiniz şeyi daha iyi anlatıyor. Ancak, bu soruya gerçekten cevap vermiyor. –