Разбор Json в Python и найти значение - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь выполнить синтаксический анализ Json, используя Python и библиотеку json

{"attributes":{"173":{"id":"173","code":"Size","label":"Size","options":[{"id":"352","label":"Footwear-41","products":["78834"]},{"id":"355","label":"Footwear-42","products":["78835"]},{"id":"357","label":"Footwear-42.5","products":["78836"]},{"id":"358","label":"Footwear-43","products":["78837"]},{"id":"361","label":"Footwear-44","products":["78838"]},{"id":"363","label":"Footwear-44.5","products":["78839"]},{"id":"364","label":"Footwear-45","products":["78840"]},{"id":"367","label":"Footwear-46","products":["78841"]}],"position":"0"}},"template":"<%- data.price %>\u00a0 \u20ac","currencyFormat":"%s\u00a0 \u20ac","optionPrices":{"78834":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]},"78835":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]},"78836":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]},"78837":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]},"78838":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]},"78839":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]},"78840":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]},"78841":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9},"tierPrices":[]}},"priceFormat":{"pattern":"%s\u00a0 \u20ac","precision":2,"requiredPrecision":2,"decimalSymbol":",","groupSymbol":".","groupLength":3,"integerRequired":1},"prices":{"oldPrice":{"amount":189.9},"basePrice":{"amount":159.57983093277},"finalPrice":{"amount":189.9}},"productId":"78842","chooseText":"Choose an Option...","images":[],"index":{"78834":{"173":"352"},"78835":{"173":"355"},"78836":{"173":"357"},"78837":{"173":"358"},"78838":{"173":"361"},"78839":{"173":"363"},"78840":{"173":"364"},"78841":{"173":"367"}},"sku":{"default":"CI6400-100","78834":"CI6400-100-Footwear-41","78835":"CI6400-100-Footwear-42","78836":"CI6400-100-Footwear-42.5","78837":"CI6400-100-Footwear-43","78838":"CI6400-100-Footwear-44","78839":"CI6400-100-Footwear-44.5","78840":"CI6400-100-Footwear-45","78841":"CI6400-100-Footwear-46"},"stock":{"78834":{"is_salable":true,"qty":1},"78835":{"is_salable":true,"qty":2},"78836":{"is_salable":true,"qty":3},"78837":{"is_salable":true,"qty":3},"78838":{"is_salable":true,"qty":3},"78839":{"is_salable":true,"qty":1},"78840":{"is_salable":true,"qty":3},"78841":{"is_salable":true,"qty":1}}}

Я хочу получить значение 'products' для определенного размера обуви, напр.если я хочу его за 42, найди 78835.

Я пытался сделать это двумя способами:

1.

tex=THEJSONTEXT
jsn=json.loads(tex)
jsn['attributes']['173'].get("products","")

Но это не работает для меня,Поэтому я попробовал версию 2:

import re
prod=re.findall('"Footwear-42","products":["\d\d\d\d\d"]', tex)

И даже у меня это не сработало ....

Ответы [ 2 ]

1 голос
/ 19 мая 2019
>>> jsn['attributes']['173'].keys()
dict_keys(['id', 'code', 'label', 'options', 'position'])

Как вы можете видеть, продукта нет, поэтому код не работает.Вы правильно анализируете JSON.

Немного отформатируете JSON

{
  "attributes": {
    "173": {
      "id": "173",
      "code": "Size",
      "label": "Size",
      "options": [
        {
          "id": "352",
          "label": "Footwear-41",
          "products": [
            "78834"
          ]
        },
        {
          "id": "355",
          "label": "Footwear-42",
          "products": [
            "78835"
          ]
        },
        {
          "id": "357",
          "label": "Footwear-42.5",
          "products": [
            "78836"
          ]
        },

... much more

И в JSON становится немного легче углубиться.Единственный атрибут, относящийся к размеру, который я вижу, находится в ключе label для различных параметров.Это верно?Если это так, вам придется отфильтровать по клавишам, чтобы список options делал то, что вы хотите.

так что ... представьте, что список опций назначен так:

options = obj['attributes']['173']['options']

Затем вы можете отфильтровать список до продуктов, которые вы хотите, как это:

>>> size = 42
>>> list(filter(lambda x: x['label'][-1 * len(str(size)):] == str(size), options))
[{'id': '355', 'label': 'Footwear-42', 'products': ['78835']}]

Итак, что делает lambda x: x['label'][-1 * len(str(size)):]?Это лямбда, которая эффективно делает это:

size = 42
def filter_product(product_object):
    label = product_object['label']
    product_size = [-1 * len(str(size)):]  # get the last digits of the str that are the size
    if str(size) == product_size:
        return True
    else:
        return False

Я смотрю последние n цифры метки в зависимости от того, как долго размер float / int.И затем я сравниваю это с размером, который вы хотите, и если он такой же, то это продукт, который вы ищете.

1 голос
/ 19 мая 2019

На самом деле есть еще один уровень вложенности. Попробуйте ниже.

for i in jsn['attributes']['173']["options"]:
    print(i["products"])

Также options - это список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...