json.loads () возвращает строку - PullRequest
3 голосов
/ 24 июня 2019

Почему json.loads () возвращает строку?Вот мой код:

import json

d = """{
    "reference": "123432",
    "business_date": "2019-06-18",
    "final_price": 40,
    "products": [
        {
            "quantity": 4,
            "original_price": 10,
            "final_price": 40,
        }
    ]
}"""

j = json.loads(json.dumps(d))
print(type(j))

Вывод:

<class 'str'>

Разве это не должно возвращать объект json?Какое изменение требуется здесь?

Ответы [ 4 ]

3 голосов
/ 24 июня 2019

Два очка:

  1. В вашем ключе products есть опечатка: "final_price": 40, должно быть "final_price": 40 (без запятой)
  2. j должно быть json.loads(d)

выход

ДИКТ

EDIT

Причины, по которым вы не можете использовать запятую в объектах json, объясняются в этом посте Можно ли использовать запятую в объекте JSON?

К сожалению, спецификация JSON не допускает конечную запятую. Есть несколько браузеров, которые позволяют это, но обычно вам нужно беспокоиться обо всех браузерах.

1 голос
/ 24 июня 2019

1).Тип d И j останется прежним.

import json

d = """{
 "reference": "123432",
 "business_date": "2019-06-18",
 "final_price": 40,
 "products": [
    {
        "quantity": 4,
        "original_price": 10,
        "final_price": 40,
    }
    ]
}"""
print(type(d))

j = json.loads(json.dumps(d))
print(type(j))

2).Теперь оба имеют тип словаря: -

import json

d = {
 "reference": "123432",
 "business_date": "2019-06-18",
 "final_price": 40,
 "products": [
    {
        "quantity": 4,
        "original_price": 10,
        "final_price": 40,
    }
    ]
}
print(type(d))

j = json.loads(json.dumps(d))
print(type(j))

По этой причине мы используем формат json.Я надеюсь, что это может помочь вам.

1 голос
/ 24 июня 2019

В вашем коде d должно быть строкой JSON.Если бы это было так, вам не пришлось бы сбрасывать его перед загрузкой.

Когда я удаляю строковые кавычки, это означает, что вызов json.dumps работает над dict, а не строкой, все, кажется, выходитштраф:

import json

d = {
    "reference": "123432",
    "business_date": "2019-06-18",
    "final_price": 40,
    "products": [
        {
            "quantity": 4,
            "original_price": 10,
            "final_price": 40,
        }
    ]
}

j = json.loads(json.dumps(d))
print(type(j))

распечатывает

<class 'dict'>

Обратите внимание, однако, что попытка применить json.loads к существующей строке приведет к ошибке, потому что JSON менее простителен, чем Python, ине допускает висячих запятых в конце списков и диктов (см. определение элемента "final_price").

1 голос
/ 24 июня 2019

ast.literal_eval: Безопасное вычисление узла выражения или строки, содержащей литерал Python или отображение контейнера. Предоставленная строка или узел могут состоять только из следующих литеральных структур Python: строк, байтов, чисел, кортежей, списков, диктов, множеств, логических значений, None, байтов и множеств. подробнее

import ast

d = """{
    "reference": "123432",
    "business_date": "2019-06-18",
    "final_price": 40,
    "products": [
        {
            "quantity": 4,
            "original_price": 10,
            "final_price": 40,
        }
    ]
}"""

data = ast.literal_eval(d)

print(data)
print(type(data))

O / P:

{'reference': '123432', 'business_date': '2019-06-18', 'final_price': 40, 'products': [{'quantity': 4, 'original_price': 10, 'final_price': 40}]}
<class 'dict'>
...