গো মানচিত্রটি জসনে রূপান্তর করুন


100

আমি আমার গো মানচিত্রটি 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}]

[]

আমি কোথায় জানি ভুল জানি না। আপনার সাহায্যের জন্য ধন্যবাদ।


32
কোন মন্তব্য না করে দয়া করে ডাউনভোট করবেন না। আমি মনে করি প্রশ্নটি একটি ভাল প্রশ্ন (+1): এটিতে সমস্ত কোড রয়েছে, এতে একটি সুনির্দিষ্ট প্রশ্ন রয়েছে, আউটপুট, ... এটি পুরোপুরি বিষয় এবং ওপি একটি ভাল প্রশ্ন জিজ্ঞাসা করার জন্য অনেক চেষ্টা করেছে। এখানে নিম্নবিত্তদের পাওয়া সত্যিই লজ্জাজনক!
টপস্কিপ

4
সমস্যাটি এ থেকে উদ্ভূত হয়েছিল যে ওপি স্পষ্টভাবে ত্রুটিটিকে উপেক্ষা করে যা প্রশ্নের উত্তরটি উত্তর দিয়েছিল।
জিমবি

4
আমি স্পষ্টভাবে বিবেকবান আমি ভুল ছিল। একটি প্রশ্নের দুটি ত্রুটি। আপনি নিশ্চিত হতে পারেন যে আমি সেগুলি পুনরুক্ত করব না।
ক্রোনোজ

উত্তর:


116

আপনি যদি ত্রুটিটি ধরেন, আপনি এটি দেখতে পেতেন:

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

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

জিনিসটি হল আপনি JSON- এ কী হিসাবে পূর্ণসংখ্যা ব্যবহার করতে পারবেন না; এটা নিষিদ্ধ. পরিবর্তে, আপনি উদাহরণস্বরূপ ব্যবহারের জন্য এই মানগুলি আগেই স্ট্রিংগুলিতে রূপান্তর করতে পারেন strconv.Itoa

আরও তথ্যের জন্য এই পোস্টটি দেখুন: https://stackoverflow.com/a/24284721/2679935


4
এখানে আপনি দেখতে পাবেন কীভাবে প্রকারের মানচিত্র: golang.org/pkg/encoding/json/#Unmarshal আপনি এর পরিবর্তে একটি স্লাইস ব্যবহার করতে পারেন, এটি একটি JSON অ্যারেতে মানচিত্র করবে। এছাড়াও:;) সবসময় ত্রুটি রয়েছে কিনা পরীক্ষা
seong

4
আমার ধারণা, আচরণ বদলে গেছে। দেখুন golang.org/pkg/encoding/json/#Unmarshal "মানচিত্র এর কী টাইপটি হয় একটি স্ট্রিং, একটি পূর্ণসংখ্যা ধরন, হতে পারে অথবা encoding.TextMarshaler বাস্তবায়ন করতে হবে।" এর জন্য
আশার হাসান

@ আশারহসান স্পষ্টতই এটি Go 1.7 ( golang.org/doc/go1.7#encoding_json ) এ পরিবর্তিত হয়েছে , তবে এটি এখনও আপনার প্রত্যাশা মতো করে না: play.golang.org/p/0aFaQ_ByOk
জুলিয়েন্স

সিঙ্ক.ম্যাপ নিয়ে এটি করার কোনও উপায় আছে কি?
শাহরুখ মোহাম্মদ

@ শাহরুখ মোহাম্মদ আমি কয়েক বছরে গো ব্যবহার করিনি, আমি আপনার প্রশ্নের উত্তর দিতে পারব না ... সম্ভবত এসও তে একটি নতুন প্রশ্ন তৈরি করার চেষ্টা করুন!
জুলিয়েন্স

27

এটি আসলে আপনাকে যা ভুল তা বলে দেয়, তবে আপনি এড়াতে পেরেছেন কারণ আপনি যে ত্রুটিটি ফিরে পেয়েছেন তা পরীক্ষা করেননি json.Marshal

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

জেএসএন স্পেক বস্তু কীগুলির জন্য স্ট্রিং ব্যতীত অন্য কোনও কিছুই সমর্থন করে না, যখন জাভাস্ক্রিপ্ট এ সম্পর্কে উদ্বিগ্ন হবে না, এটি এখনও অবৈধ।

আপনার দুটি বিকল্প রয়েছে:

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
তুমি ঠিক বলছো. এটি একটি লজ্জাজনক ত্রুটি ... আমি কেন জানি না যে আমি কেন একটি জেসন কী ব্যবহার করেছিলাম ... আপনার উদাহরণের জন্য আপনাকে ধন্যবাদ।
ক্রোনোজ

2

যেহেতু এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল / শেষ উত্তর দেওয়া হয়েছিল, এখানে টেক্সটমারশালার এবং টেক্সটউনমারশেলার ইন্টারফেসের মাধ্যমে জেসন মার্শাল / উনমারশালের মানচিত্রের জন্য নন স্ট্রিং কী ধরণের জন্য সমর্থন যোগ করা হয়েছে । আপনি কেবল আপনার মূল ধরণের জন্য এই ইন্টারফেসগুলি প্রয়োগ করতে পারেন এবং তারপরে 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}]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.