Почему 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? Какие изменения необходимы здесь?

5
Zid 24 Июн 2019 в 14:23

4 ответа

Лучший ответ

Два момента:

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

< Сильный > Выход

ДИКТ

< Сильный > ИЗМЕНИТЬ

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

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

3
Sebastien D 24 Июн 2019 в 12:22

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'>
1
bharatk 15 Июл 2019 в 05:32

В вашем коде 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, и не допускает висячих запятых в конце списков и диктов (см. {{X1} } определение элемента).

1
holdenweb 24 Июн 2019 в 11:35

1 ) . Тип d AND 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
Rahul charan 24 Июн 2019 в 11:57