Как итерироваться по полученyому json с Unmarshal в interface?
Часть кода получения данных из ответа OpenSearch:
searchResponse, err := search.Do(context.Background(), client)
if err != nil {
log.Fatal(err)
}
data, _ := ioutil.ReadAll(searchResponse.Body)
jsonMap := map[string]interface{}{}
json.Unmarshal([]byte(string(data)), &jsonMap)
json.NewEncoder(w).Encode(jsonMap)
Задача получить каждый item из hits -> hits -> _source.
Была мысль использовать структуру, и mapping на нее, либо все указать прям в интерфейсе.
Часть данных по которым задача итерироваться:
{
"_shards": {
"failed": 0,
"skipped": 0,
"successful": 1,
"total": 1
},
"hits": {
"hits": [
{
"_id": "11",
"_index": "catalog_product",
"_score": 1,
"_source": {
"attributes": [],
"brands": [
{
"id": 3,
"is_deleted": false,
"title": "GUCCI"
}
],
"description": "Разноцветную рубашку с короткими рукавами сшили из легкого нежного шелка с пиксельным 3D паттерном в виде логотипа марки. Модель, комфортно струящуюся по фигуре, дополнили накладным карманом. Яркое изделие станет цветовым акцентом в образе, но наши стилисты рекомендуют создать образ с парными шортами.",
"id": 11,
"is_deleted": false,
"medias": [
{
"id": 58,
"is_deleted": false,
"type": "photo",
"url": "https://st-cdn.tsum.com/sig/7573fb18b7bbfa4ba7bc2e36877be750/width/763/i/f7/de/19/01/fea10b33-937e-4099-99c2-a1dbb5a1041e.jpg"
}
]
}
}
]
}
}
Ответы (1 шт):
Автор решения: Алексей
→ Ссылка
Как по мне это самый простой вариант:
type Response struct {
Hits struct {
Hits []struct {
Source map[string]interface{} `json:"_source"`
} `json:"hits"`
} `json:"hits"`
}
func main() {
var resp Response
json.Unmarshal(data, &resp)
for k, v := range resp.Hits.Hits[0].Source {
fmt.Println(k, v)
}
}
Конечно можно из интерфейса доставать, но это будет сложнее.