2014-07-09 16 views
48

Git haritamı encoding/json Mareşal ile bir json dizgisine dönüştürmeyi denedim, ancak boş bir dize ile sonuçlandı.Convert Go map to json

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Foo struct { 
    Number int `json:"number"` 
    Title string `json:"title"` 
} 

func main() { 
    datas := make(map[int]Foo) 

    for i := 0; i < 10; i++ { 
     datas[i] = Foo{Number: 1, Title: "test"} 
    } 

    jsonString, _ := json.Marshal(datas) 

    fmt.Println(datas) 
    fmt.Println(jsonString) 
} 

Benim çıkışı:

map[9:{1 test} 2:{1 test} 7:{1 test} 3:{1 test} 4:{1 test} 5:{1 test} 6:{1 test} 8:{1 test} 0:{1 test} 1:{1 test}] 

[] 

yanılıyorum nerede gerçekten bilmiyorum

İşte benim kod. Yardımın için teşekkürler. Hatayı yakalandı olsaydı

+12

givi olmadan downvote etmeyin Bir yorum. Bence soru iyi bir sorudur (+1): tüm kodu içerir, kesin bir soru içerir, çıktı, ... Bu tamamen konuyla ilgili ve OP iyi bir soru sormak için çok çaba sarf etti. Bu downvotes burada gerçekten utanç verici! – topskip

+3

Sorun, OP'nin soruyu hemen yanıtlayacak olan hatayı açıkça göz ardı ettiği gerçeğinden kaynaklanıyor. – JimB

+2

Açıkçası vicdanlı olduğum yanlıştı. Bir soruda iki hata. Onları tekrarlamayacağından emin olabilirsiniz. – Cronos87

cevap

53

, bu görürdü:

jsonString, err := json.Marshal(datas) 
fmt.Println(err) 

// [] json: unsupported type: map[int]main.Foo 

şey JSON tuşları olarak tamsayılar kullanamazsınız olduğu; yasaktır. Bunun yerine, strconv.Itoa kullanarak, bu değerleri önceden dizelere dönüştürebilirsiniz.

fazla ayrıntı için bu yazı bakın: Aslında neyin yanlış söyler https://stackoverflow.com/a/24284721/2679935

+2

Burada, haritaların nasıl göründüğünü görebilirsiniz: http://golang.org/pkg/encoding/json/#Unmarshal JSON dizisini eşleyecek bir dilim kullanabilirsiniz. Ayrıca: her zaman hataları kontrol edin;) – seong

+0

Davranışın değiştiğini tahmin ediyorum. Https://golang.org/pkg/encoding/json/#Unmarshal adresine bakın. "Haritanın anahtar türü, bir dize, tamsayı türü veya kodlama uygulaması olmalıdır. TextMarshaler." –

+0

@AshharHasan Görünüşe göre Go 1.7'de (https://golang.org/doc/go1.7#encoding_json) değişti, ama yine de beklediğiniz şeyi yapmıyor: https://play.golang.org/p/ 0aFaQ_ByOk – julienc

20

ancak hata json.Marshal dönen onay vermedi çünkü bunu görmezden geldi. JavaScript bu konuda telaşlı durumda olmaz

json: unsupported type: map[int]main.Foo

JSON Spec hala yasadışı, nesne anahtarları için dizeleri dışında bir şey desteklemez.

İki seçeneğiniz vardır:

1 Kullanım map[string]Foo ve dize (örneğin fmt.Sprint kullanarak) için endeksini dönüştürmek:

datas := make(map[string]Foo, N) 

for i := 0; i < 10; i++ { 
    datas[fmt.Sprint(i)] = Foo{Number: 1, Title: "test"} 
} 
j, err := json.Marshal(datas) 
fmt.Println(string(j), err) 

2 Basitçe sadece bir dilim (javascript dizi) kullanın:

datas2 := make([]Foo, N) 
for i := 0; i < 10; i++ { 
    datas2[i] = Foo{Number: 1, Title: "test"} 
} 
j, err = json.Marshal(datas2) 
fmt.Println(string(j), err) 

playground

+3

Haklısınız. Bu utanç verici bir hata ... Neden bir json anahtarı için int kullanmış olduğumu bilmiyorum ... Örnekleriniz için teşekkür ederim. – Cronos87