गो मैप को जसन में बदलें


94

मैंने अपने Go मैप को json string से बदलने की कोशिश की encoding/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)
}

मेरा आउटपुट है:

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

[]

मैं वास्तव में नहीं जानता कि मैं कहाँ गलत हूँ। आपके सहयोग के लिए धन्यवाद।


30
कृपया बिना टिप्पणी दिए नीचे न जाएं। मुझे लगता है कि प्रश्न एक अच्छा प्रश्न है (+1): इसमें सभी कोड शामिल हैं, इसमें एक सटीक प्रश्न, आउटपुट शामिल है, ... यह पूरी तरह से विषय पर है और ओपी ने एक अच्छा प्रश्न पूछने के लिए बहुत प्रयास किया है। यह वास्तव में यहाँ downvotes है के लिए एक शर्म की बात है!
टॉपस्किप

4
समस्या इस तथ्य से उपजी है कि ओपी स्पष्ट रूप से उस त्रुटि को नजरअंदाज कर देता है, जिसने इस प्रश्न का उत्तर स्पष्ट रूप से दिया होगा।
जिमबेल

3
मैं स्पष्ट रूप से ईमानदार हूं मैं गलत था। एक प्रश्न में दो त्रुटियां। आप सुनिश्चित हो सकते हैं कि मैं उन्हें नहीं दोहराऊंगा।
क्रोनोस87

जवाबों:


110

यदि आपने त्रुटि पकड़ी है, तो आपने इसे देखा होगा:

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

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

बात यह है कि आप JSON में कुंजियों के रूप में पूर्णांक का उपयोग नहीं कर सकते हैं; यह निषिद्ध है। इसके बजाय, आप इन मानों को पहले से स्ट्रिंग्स में परिवर्तित कर सकते हैं, उदाहरण के लिए strconv.Itoa

अधिक जानकारी के लिए इस पोस्ट को देखें: https://stackoverflow.com/a/24284721/2679935


3
यहाँ आप देख सकते हैं कि किस प्रकार का नक्शा: golang.org/pkg/encoding/json/#Unmarshal आप इसके बजाय एक स्लाइस का उपयोग कर सकते हैं, जो JSON सरणी में मैप होगा। इसके अलावा:;) हमेशा त्रुटियों की जांच
सियोंग

2
मुझे लगता है कि व्यवहार बदल गया है। Golang.org/pkg/encoding/json/#Unmarshal के लिए देखें "मानचित्र का कुंजी प्रकार या तो एक स्ट्रिंग, पूर्णांक प्रकार होना चाहिए, या एन्कोडिंग को लागू करना चाहिए। TxtMarshaler ।"
अशर हसन

@AharharHasan जाहिरा तौर पर यह गो 1.7 ( golang.org/doc/go1.7#encoding_json ) में बदल गया , लेकिन यह अभी भी वह नहीं करता है जो आप उम्मीद करेंगे: play.golang.org/p/0aaaQ_ByOk
julienc

वहाँ एक सिंक के साथ ऐसा करने का एक तरीका है।
शाहरुख मोहम्मद

@ शाहरुखमोहम्मद ने वर्षों में गो का उपयोग नहीं किया है, मैं आपके प्रश्न का उत्तर नहीं दे पाऊंगा ... शायद एसओ पर एक नया प्रश्न बनाने की कोशिश करूं!
जूलेंक

27

यह वास्तव में आपको बताता है कि क्या गलत है, लेकिन आपने इसे अनदेखा कर दिया क्योंकि आपने त्रुटि वापस नहीं की थी json.Marshal

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

JSON युक्ति ऑब्जेक्ट कुंजियों के लिए तार को छोड़कर कुछ भी समर्थन नहीं करता है, जबकि जावास्क्रिप्ट इसके बारे में उधम मचाएगा नहीं, यह अभी भी अवैध है।

आपके पास दो विकल्प हैं:

1 map[string]Fooइंडेक्स और स्ट्रिंग में कनवर्ट करें (उदाहरण के लिए fmt.Sprint का उपयोग करके):

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 बस एक स्लाइस (जावास्क्रिप्ट सरणी) का उपयोग करें:

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


4
आप सही हे। यह एक शर्मनाक त्रुटि है ... मैं वास्तव में नहीं जानता कि मैंने एक जोंस कुंजी के लिए एक इंट का उपयोग क्यों किया ... आपके उदाहरणों के लिए धन्यवाद।
क्रोनोस87

2

चूँकि यह प्रश्न पूछा गया था / अंतिम उत्तर दिया गया था, json Marshal / UnMarshal के मानचित्रों के लिए गैर स्ट्रिंग कुंजी प्रकारों के लिए समर्थन यहाँ TextMarshaler और TextUnmarshaler इंटरफेस के उपयोग के माध्यम से जोड़ा गया है । आप अपने प्रमुख प्रकारों के लिए इन इंटरफेस को लागू कर सकते हैं और फिर json.Marshalउम्मीद के मुताबिक काम करेंगे।

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

// Num wraps the int value so that we can implement the TextMarshaler and TextUnmarshaler 
type Num int

func (n *Num) UnmarshalText(text []byte) error {
    i, err := strconv.Atoi(string(text))
    if err != nil {
        return err
    }
    *n = Num(i)
    return nil
}

func (n Num) MarshalText() (text []byte, err error) {
    return []byte(strconv.Itoa(int(n))), nil
}

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

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

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

    jsonString, err := json.Marshal(datas)
    if err != nil {
        panic(err)
    }

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

    m := make(map[Num]Foo)
    err = json.Unmarshal(jsonString, &m)
    if err != nil {
        panic(err)
    }

    fmt.Println(m)
}

आउटपुट:

map[1:{1 test} 2:{1 test} 4:{1 test} 7:{1 test} 8:{1 test} 9:{1 test} 0:{1 test} 3:{1 test} 5:{1 test} 6:{1 test}]
[123 34 48 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 49 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 50 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 51 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 52 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 53 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 54 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 55 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 56 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 57 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 125]
map[4:{1 test} 5:{1 test} 6:{1 test} 7:{1 test} 0:{1 test} 2:{1 test} 3:{1 test} 1:{1 test} 8:{1 test} 9:{1 test}]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.