Я новичок в голанге. У меня есть файл json с вложенными структурами, которые я хочу проанализировать и заполнить.
Я пытаюсь использовать структуру карты, чтобы попытаться заполнить. Я могу сделать это для простых структур. Но когда дело доходит до массива для словарей (ключ: структура). Кажется, что map[string]interface{} терпит неудачу с runtime error: index out of range.
Я попытался сделать следующее для примера json ниже.
type Window struct {
loc []int
wrtc string
label string
}
type View struct {
windows []Window
}
type Views struct {
views []View
}
type Desktop struct {
views []Views `mapstructure:views`
rotation_speed string `mapstructure:"rotationSpeed" json:rotationSpeed"`
}
func main() {
file, _ := ioutil.ReadFile("test.json")
data := Desktop{}
_ = json.Unmarshal([]byte(file), &data)
fmt.Println("data: ", data.views[0])
}
{
"desktop": {
"view": [{// configs for view1
"random_id1": {
"loc": [0,0,640,360],
"wrtc": "some string",
"label": "window 1"
},
"random_id213443": {
"loc": [640,360,1280,720],
"wrtc": "some string blah",
"label": "window 2"
},
// more windows with random ids....
},
{
// configs for view2...
}
],
"rotationSpeed": 30
}
Поскольку идентификатор окна является случайным, я не могу определить его в структуре. Я пытался использовать mapstructure:",squash", но, похоже, это тоже не помогло.
Я ценю любую помощь в этом.
Вы также можете избежать (а не решить) этой проблемы, изменив моделирование, вместо случайных идентификаторов в ключе они могут быть в значении, поэтому переход от карты к массиву.
Отвечает ли это на ваш вопрос? JSON и работа с неэкспортируемыми полями
@BurakSerdar Большое спасибо за ваш ответ. Я экспортировал элементы структуры и изменил элемент представления как карту структуры представления. Теперь он не segfault, но кажется, что в массиве View ничего нет (поэтому в основном он его не заполнил. Я также попытался изменить структуру json, чтобы сделать часть структуры random_id, как предложил @Cadmium, но я не могу заставить его проанализировать .
Опубликуйте обновленный код, и мы можем попытаться выяснить
@Бурак Сердар прав
Вам не нужна структура карты. С этим может справиться демаршалинг JSON.
В вашем коде много ошибок, таких как структура, верхний регистр, «представления» и т. д.
Следуйте демо:
package main
import (
"encoding/json"
"fmt"
)
var data = `
{
"desktop":{
"view":[
{
"random_id1_1":{
"loc":[
0,
0,
640,
360
],
"wrtc":"some string",
"label":"window 1"
},
"random_id1_2":{
"loc":[
640,
360,
1280,
720
],
"wrtc":"some string blah",
"label":"window 2"
}
},
{
"random_id2_1":{
"loc":[
0,
0,
640,
360
],
"wrtc":"some string",
"label":"window 1"
},
"random_id2_2":{
"loc":[
640,
360,
1280,
720
],
"wrtc":"some string blah",
"label":"window 2"
}
}
],
"rotationSpeed":30
}
}
`
type Window struct {
Loc []int
Wrtc string
Label string
}
type Desktop struct {
View []map[string]Window
Rotation_speed int `json:"rotationSpeed" mapstructure:"rotationSpeed"`
}
type Config struct {
Desktop Desktop
}
func main() {
c := Config{}
json.Unmarshal([]byte(data), &c)
fmt.Println("json.Unmarshal: ", c)
}
json.Unmarshal: {{[map[random_id1_1:{[0 0 640 360] some string window 1} random_id1_2:{[640 360 1280 720] some s
tring blah window 2}] map[random_id2_1:{[0 0 640 360] some string window 1} random_id2_2:{[640 360 1280 720] some
string blah window 2}]] 30}}
Также вы можете использовать структуру карты с помощью «остаться», если хотите View struct
type Window struct {
Loc []int
Wrtc string
Label string
}
type View struct {
Windows map[string]Window `mapstructure:",remain"`
}
type Desktop struct {
View []View
Rotation_speed int `json:"rotationSpeed" mapstructure:"rotationSpeed"`
}
type Config struct {
Desktop Desktop
}
func main() {
c2 := Config{}
m := map[string]interface{}{}
_ = json.Unmarshal([]byte(data), &m)
mapstructure.Decode(m, &c2)
fmt.Println("mapstructure: ", c2)
}
Вам не нужна структура карты. С этим может справиться демаршалинг JSON. Вам нужно экспортировать члены вашей структуры (заглавные буквы). Элемент view — это элемент []map[string]View, где View — это структура для каждого представления.