Как правильно распарсить 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 } |
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"` } |
type ParsedNodesFilters struct { Total int `json:"total"` Page int `json:"page"` Products []map[string]interface{} `json:"query"` }
Сейчас в ответе пустой массив products.
Дополнительно:
Вы нарушили пункты 3.1 и 3.8 правил. Не надо ставить все теги подряд и замените изображения текстом.
В правый столбик тут нужно кинуть JSON а в левом будет сгенерирована нужная структура, которую можно будет использовать для маршалинга/анмаршалинга
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для правильного распарсивания JSON в языке программирования PHP можно воспользоваться функцией json_decode. Эта функция позволяет преобразовать строку JSON в объект или ассоциативный массив, в зависимости от переданных параметров.
Пример использования функции json_decode для распарсивания JSON:
$jsonString = '{"name": "John", "age": 30, "city": "New York"}'; $data = json_decode($jsonString); var_dump($data);
В данном примере мы передаем строку JSON в переменную $jsonString, затем с помощью функции json_decode преобразуем эту строку в объект или массив и сохраняем результат в переменную $data. Далее мы используем функцию var_dump для вывода содержимого переменной $data на экран.
Если необходимо преобразовать JSON в ассоциативный массив, то можно передать второй параметр функции json_decode со значением true:
$jsonString = '{"name": "John", "age": 30, "city": "New York"}'; $data = json_decode($jsonString, true); var_dump($data);
Таким образом, мы можем легко и удобно распарсить JSON в PHP с помощью функции json_decode. Важно учитывать, что функция вернет null в случае ошибки парсинга JSON, поэтому стоит проверять результат на null перед работой с данными.