Mapstructure json в структуру с вложенным словарем

Я новичок в голанге. У меня есть файл 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. Вам нужно экспортировать члены вашей структуры (заглавные буквы). Элемент view — это элемент []map[string]View, где View — это структура для каждого представления.

Burak Serdar 11.01.2023 01:03

Вы также можете избежать (а не решить) этой проблемы, изменив моделирование, вместо случайных идентификаторов в ключе они могут быть в значении, поэтому переход от карты к массиву.

Cadmium 11.01.2023 01:07

Отвечает ли это на ваш вопрос? JSON и работа с неэкспортируемыми полями

Erwin Bolwidt 11.01.2023 01:21

@BurakSerdar Большое спасибо за ваш ответ. Я экспортировал элементы структуры и изменил элемент представления как карту структуры представления. Теперь он не segfault, но кажется, что в массиве View ничего нет (поэтому в основном он его не заполнил. Я также попытался изменить структуру json, чтобы сделать часть структуры random_id, как предложил @Cadmium, но я не могу заставить его проанализировать .

Guru Govindan 11.01.2023 03:04

Опубликуйте обновленный код, и мы можем попытаться выяснить

Burak Serdar 11.01.2023 03:26
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
0
5
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@Бурак Сердар прав

Вам не нужна структура карты. С этим может справиться демаршалинг 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)
}

Другие вопросы по теме