Unmarshal JSON в структуру карты

#json #dictionary #go #struct #unmarshalling

#json #словарь #Вперед #структура #разархивировать

Вопрос:

У меня есть программа ниже. Мне нужно преобразовать данные JSON в кэш объектного типа, который содержит одно поле строкового типа map [string]. Есть что-то, что я делаю неправильно при инициализации map и разархивировании JSON, но не могу определить проблему синтаксиса.

Примечание: я упорядочил данные только для удобства, чтобы иметь образцы данных JSON.

 package main

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

const data = `{"Mode":{"ID-1":"ON","ID-2":"OFF","ID-3":"ON"}}`

type Cache struct {
    Mode map[string]string `json:"Mode"`
}

func main() {
    jsonData, _ := json.Marshal(data)
    fmt.Println(strconv.Unquote(string(jsonData)))

    var c Cache
    c.Mode = make(map[string]string) //I want to initialise map so that I can store data in next step, but this is wrong I know
    c.Mode["ID-4"] = "ON" //Want to store data like this
    
    json.Unmarshal(jsonData, amp;c) 
    fmt.Println(c) //I am getting output as nil map i.e. {map[]}
    for k, v := range c.Mode {
        fmt.Println(k, v) //I am getting NO output i.e. blank
    }
}
 

Комментарии:

1. Вы разархивируете строку, закодированную в формате json. Просто разархивируйте ввод json: json.Unmarshal([]byte(data),amp;c)

2. Ошибка, возвращенная из json. Unmarshal объясняет проблему. Всегда проверяйте ошибки. Исправлено путем декодирования исходного JSON-документа вместо JSON-кодировки строки, содержащей документ.

Ответ №1:

Вот ваш исправленный код https://play.golang.org/p/5ftaiz_Q5wl (прилагая копию)

 package main
import (
    "encoding/json"
    "fmt"
    "log"
)

const data = `{"Mode":{"ID-1":"ON","ID-2":"OFF","ID-3":"ON"}}`

type Cache struct {
    Mode map[string]string `json:"Mode"`
}

func main() {
    c := Cache{}
    err := json.Unmarshal([]byte(data), amp;c)
    if err != nil {
        log.Println(err)
    }
    c.Mode["ID-4"] = "ON" //Want to store data like this

    fmt.Println(c) 
    for k, v := range c.Mode {
        fmt.Println(k, v) 
    }
}
 

Вот результат:

 {map[ID-1:ON ID-2:OFF ID-3:ON ID-4:ON]}
ID-2 OFF
ID-3 ON
ID-4 ON
ID-1 ON