Как итерироваться по получен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)
    }
}

Конечно можно из интерфейса доставать, но это будет сложнее.

→ Ссылка