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

Ссылка скопирована
Go
1 ответ

Подскажите, пожалуйста, как правильно распарсить 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 а в левом будет сгенерирована нужная структура, которую можно будет использовать для маршалинга/анмаршалинга

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для правильного распарсивания JSON в языке программирования PHP можно воспользоваться функцией json_decode. Эта функция позволяет преобразовать строку JSON в объект или ассоциативный массив, в зависимости от переданных параметров.

Пример использования функции json_decode для распарсивания JSON:

$jsonString = '{"name": "John", "age": 30, "city": "New York"}';
$data = json_decode($jsonString);
var_dump($data);

$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);

$jsonString = '{"name": "John", "age": 30, "city": "New York"}'; $data = json_decode($jsonString, true); var_dump($data);

Таким образом, мы можем легко и удобно распарсить JSON в PHP с помощью функции json_decode. Важно учитывать, что функция вернет null в случае ошибки парсинга JSON, поэтому стоит проверять результат на null перед работой с данными.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно