#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