Судя по опубликованному контенту, я понимаю, что у вас возникают проблемы с извлечением данных из вложенной строки JSON.
Я взял ваш фрагмент кода и попытался скомпилировать и воспроизвести проблему , После наблюдения у меня есть несколько предложений, основанных на том, как был написан код.
- Когда известно, что тип данных в
s
похож на тип Model
, result
мог быть объявлен как type Model
. Это приводит к var result Model
вместо map[string]interface{}
. Когда данные, которые будут декодироваться из interface{}
, неизвестны, использование switch
может прийти на помощь без сбоя код. Нечто похожее на:
switch dataType := result["RelatedItems"].(type){
case interface{}:
// Handle interface{}
case []map[string]interface{}:
// Handle []map[string]interface{}
default:
fmt.Println("Unexpected-Datatype", dataType)
// Handle Accordingly
Когда мы пытаемся Unmarshal, мы обязательно рассмотрим json tags
, которые предусмотрены для полей структуры , Если закодированные данные не имеют предоставленных нами тегов, данные не будут соответственно декодированы. Следовательно, результат декодирования данных из s
в result
приведет к {ABC123 [{ } { }]}
, поскольку теги полей Name
, RId
, RName
, RChildren
заданы как ModelName
, PCId
, PCName
, string
соответственно.
С учетом приведенных выше предложений и уточнения приведенных тегов фрагмент кода будет следующим, что определенно извлечет данные из вложенного JSON структур.
s := string(`{"Id": "ABC123",
"Name": "Hello",
"RelatedItems":[
{"RId":"TEST123","RName":"TEST1","RChildren":"Ch1"},
{"RId":"TEST234","RName":"TEST2","RChildren":"Ch2"}]
}`)
var result Model
json.Unmarshal([]byte(s), &result)
fmt.Println(result)
type Model struct {
Id string `json:"Id"`
Name string `json:"Name"`
RelatedItems []RelatedItems `json:"RelatedItems"`
}
type RelatedItems struct {
RId string `json:"RId"`
RName string `json:"RName"`
RChildren string `json:"RChildren"`
}
В результате получается: {ABC123 Hello [{TEST123 TEST1 Ch1} {TEST234 TEST2 Ch2}]}