Задать вопрос
Nikolaanastasiia
@Nikolaanastasiia

Как правильно распарсить json?

Подскажите, пожалуйста, как правильно распарсить json на Golang. Желаемый ответ должен быть в виде total, page, products (картинка прикреплена), сейчас products пустой массив. Возвращаемый тип должен быть []map[string]interface{}? Как сделать так, чтобы было как здесь(Python):
total = result.get("query_total", [])
result = result.get("query", [])

if len(total) > 0:
total = total[0].get("total")
else:
total = -1
return JSONResponse(
content={"total": total, "page": page, "products": result},
status_code=status.HTTP_200_OK,
)
func (r NodesRepository) GetNodesByFilters(dgraphTypeName string, predicates map[string]string, edgeName string, offset int, page int) (map[string]interface{}, error) {
	var filters []string
	for filterObject, filterValue := range predicates {
		filters = append(filters, fmt.Sprintf(`eq(%s, "%s")`, filterObject, filterValue))
	}

	filtersString := strings.Join(filters, " and ")
	queryText := fmt.Sprintf(`
        query node_type($node_type_name: string){
            query_items (func: type($node_type_name)) @filter(%s) {
                total: count(<~%s>)
                items as <~%s> {}
            }
            query_total(func: uid(items))  @recurse(depth: 2) {
                total: count(uid)
            }
            query(func: uid(items), first: 100, offset: %d) 
            @recurse(depth: 2) {
                expand(_all_)
            }
        }
    `, filtersString, edgeName, edgeName, page*100)

	resp, err := r.Dg.NewReadOnlyTxn().QueryWithVars(context.TODO(), queryText, map[string]string{
		"$node_type_name": dgraphTypeName,
	})

	if err != nil {
		log.Println("error querying data:", err)
		return nil, fmt.Errorf("failed to query data: %v", err)
	}

	parsedData := models.ParsedNodesFilters{Products: make([]map[string]interface{}, 0)}
	//	var parsedData models.ParsedNodesFilters

	if err := json.Unmarshal(resp.Json, &parsedData); err != nil {
		log.Println("error parsing JSON:", err)
		return nil, fmt.Errorf("failed to parse JSON: %v", err)
	}

	total := -1
	if parsedData.Total > 0 {
		total = parsedData.Total
		//total1 = strconv.Atoi(total)
	}
	//	return parsedData.Products, nil
	var (
		response = map[string]interface{}{
			"total":    total,
			"page":     page,
			"products": parsedData.Products,
		}
	)
	return response, nil
}


type ParsedNodesFilters struct {
	Total    int                      `json:"total"`
	Page     int                      `json:"page"`
	Products []map[string]interface{} `json:"query"`
}

Сейчас в ответе пустой массив products.
  • Вопрос задан
  • 170 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
@12rbah
В правый столбик тут нужно кинуть JSON а в левом будет сгенерирована нужная структура, которую можно будет использовать для маршалинга/анмаршалинга
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы