Извлечь значение из json response python?

Я делаю запрос к конечной точке и получаю ответ json в следующем формате.

r = requests.get(url)
print(r.json())

{"context":"product=fhvh, price=25,product=vfjvnf,price=37,product=fvfv,price=3.....}

Я хочу перебрать их и получить количество продуктов, цена которых превышает 22.

Как я могу это получить? Сначала я пытался перебрать ответ json, но я не верю, что это сработает из-за формата вывода. Есть ли лучшее решение? Как я могу сначала преобразовать ответ, возможно, в dict или tuple? Кто-нибудь может мне помочь. Спасибо.

Вы знаете структуру ответа? Можете ли вы предоставить скелет?

Praveen Premaratne 18.05.2022 01:39

@PraveenPremaratne Да, есть. Это скелет :- {"context":"product=fhvh, price=25,product=vfjvnf,price=37,product=fvfv,price=3.....}

Somethingwhatever 18.05.2022 01:40

Вы знаете, всегда ли они приходят парами? product=fhvh, price=25

Praveen Premaratne 18.05.2022 01:44

@PraveenPremaratne Да, это всегда идет парами.

Somethingwhatever 18.05.2022 01:44

Похоже, этот вопрос больше касается обработки строк, а не JSON.

PIG208 18.05.2022 01:44

Все продукты уникальны?

Richard Dodson 18.05.2022 01:44

@RichardDodson Да, все они уникальны.

Somethingwhatever 18.05.2022 01:45

Итак, ваш ответ приходит в виде неупорядоченного упорядоченного списка внутри строки без проверки (например, product=fhvh и т. д.)? Можете ли вы просто опубликовать фактический JSON?

psychopg2 18.05.2022 01:47

@psychopg2 К сожалению, это фактические данные, которые я получаю.

Somethingwhatever 18.05.2022 01:48

У меня есть решение, но оно не идеальное, и я бы лично им не воспользовался.

Praveen Premaratne 18.05.2022 01:48

@PraveenPremaratne Не могли бы вы поделиться им, пожалуйста?

Somethingwhatever 18.05.2022 01:49
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
11
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это наихудшее из возможных решений, оно основано на том, что ответ всегда имеет product и price и может быть очень ненадежным.

r = requests.get(url)
data = r.json()

context=data.get('context')
elements = context.split(',')
chunks=[elements[i:i + 2] for i in range(0, len(elements), 2)]
print(chunks)
[['product=fhvh', ' price=25'], ['product=vfjvnf', 'price=37'], ['product=fvfv', 'price=3']]

Я бы посмотрел на библиотеки обработки данных, используемые большими данными, такими как Pandas, у которых может быть более надежный способ сделать это.

Обновлять

r = requests.get(url)
data = r.json()

context=data.get('context')
elements = context.split(',')
chunks=[elements[i:i + 2] for i in range(0, len(elements), 2)]
print(chunks)

product_list = []
for item in chunks:
     obj1=item[0].split('=')
     obj2=item[1].split('=')
     product = { obj1[0].strip(): obj1[1].strip(), obj2[0].strip(): float(obj2[1].strip())}
     product_list.append(product)

print(product_list)

for product in product_list:
     if product.get('price') > 22.0:
             print(product)

Хммм, так вы преобразовали его в меньшие списки. Как я могу получить товар, цена которого больше 22?

Somethingwhatever 18.05.2022 01:51

У него всегда есть цена и продукт.

Somethingwhatever 18.05.2022 01:53

Это массив массивов... поэтому вы можете просто выполнить итерацию и построить другой массив, содержащий элементы, стоимость которых превышает определенную цену.

Praveen Premaratne 18.05.2022 01:53

Да, если ответ предоставляет его в таком порядке. Так что, если ответ делает это product=fhvh, product=vfjvnf, price=25, price=37, вы облажались.

Praveen Premaratne 18.05.2022 01:54

Вот почему это очень ненадежно, вы верите в то, что API всегда будет последовательным.

Praveen Premaratne 18.05.2022 01:55

Что ж, я все равно приму это как потенциальный ответ и посмотрю на панд.

Somethingwhatever 18.05.2022 01:57

Спасибо вам за помощь.

Somethingwhatever 18.05.2022 01:57

@Somethingwhatever проверьте обновление, оно должно работать.

Praveen Premaratne 18.05.2022 02:09

Ваша проблема в том, что у вас есть полезная нагрузка не в формате JSON, а в каком-то альтернативном формате. Я бы посоветовал преобразовать каждую запись в context в объект:

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = float(price)

def parse_data(resp):

    # First, read in the JSON
    raw_data = r.json()
 
    # Next, split the context field in the JSON into a list-of-tuples
    # where each item represents a key and value.
    parsed_data = [tuple(item.strip().split('=')) for item in raw_data["context"].split(',')]
   
    # Finally, convert each product to our type and return the list of them
    # This assumes that the payload contains a product followed by a price
    return [Product([i][1], y[i + 1][1]) for i in range(0, len(y), 2)]

r = requests.get(url)
filtered = [product for product in parse_data(r) if product.price > 22]

Этот код подчиняется разделению ответственности и выдает желаемый результат (все продукты с ценой выше 22). При этом это в значительной степени зависит от предположений о том, что возвращается из API, который вы запрашиваете. Вы захотите добавить проверки данных, чтобы убедиться, что вы не получаете неверные данные.

Это выглядит намного лучше, чем у меня, но я бы оценил цену как float. Может иметь десятичные дроби.

Praveen Premaratne 18.05.2022 02:12

@PraveenPremaratne Я думаю, что это правильное замечание. На самом деле, я не думаю, что вообще анализировал значение.

Woody1193 18.05.2022 02:17

Другие вопросы по теме