UnMarshal сделает все возможное, чтобы разместить данные там, где они лучше всего соответствуют вашей структуре. Технически ваш первый пример будет работать, но вы пытаетесь получить доступ к полю Value
с точечной нотацией, даже если вы объявили его картой:
Это должно дать вам некоторую форму вывода:
if data.Type == 'image'{
fmt.Printf("%v\n", data.Value["Imagedata"])
}
... учитывая, что "Imagedata" была ключом в json.
У вас есть возможность определить структуру настолько глубоко, насколько вы хотите или ожидаете структуру, или использовать интерфейс {}, а затем делать утверждения типа для значений. Если поле «Значение» является картой, вы всегда будете иметь доступ к ключам, таким как Value[key]
, а затем значением этой карты будет интерфейс {}, который вы можете ввести assert, например, Value[key].(float64)
Что касается создания более явных структур, я обнаружил, что вы можете либо разбить объекты на их собственные структуры, либо определить их в одном месте:
Вложенный (с анонимной структурой)
type Frame struct {
Type string
Value struct {
Imagedata string `json:"image_data"`
}
}
Отдельные структуры
type Frame struct {
Type string
Value value
}
type value struct {
Imagedata string `json:"image_data"`
}
Я все еще учусь иди сам, так что это степень моего текущего понимания: -)