json.loads() 返回一个字符串

9
为什么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对象,需要做出哪些改变呢?

"移除d中引号前后的大括号 {}" should be the translated text. - Siddharth Das
"reference": "123432", "business_date": "2019-06-18", "final_price": 40, "products": [ { "quantity": 4, "original_price": 10, "final_price": 40 } ] } ```JSON 数据 - Subham
4个回答

6

两点:

  1. 你的products关键字有一个拼写错误:"final_price": 40,应该是"final_price": 40(没有逗号)。
  2. j应该是json.loads(d)

输出

字典

编辑

在此帖子Can you use a trailing comma in a JSON object?中解释了不能在json对象中使用尾随逗号的原因。

不幸的是,JSON规范不允许使用尾随逗号。有一些浏览器会允许它,但通常需要考虑所有浏览器。


1
在Python中,逗号不会影响结果。 - Rahul charan
1
d = {'a':10,} 和 d = {'a':10} 都会得到相同的结果。Python 不区分大小写。在您的计算机上尝试一下吧。 - Rahul charan
1
json.loads('{"a":[10,]}')json.loads('{"a":[10]}') 有何不同? - Sebastien D
1
可以在 JSON 对象中使用尾随逗号吗? - Sebastien D
1
你说得对。我从来没有想过这个问题。今天我学到了新东西。 - Rahul charan
显示剩余3条评论

3

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

输出:

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

2

1). The type of d AND j will remain same.

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
在您的代码中,d 应该是一个 JSON 字符串。如果是这样的话,在加载之前您就不需要将其转换为字符串了。
当我去除字符串引号时,也就是说 json.dumps 调用的是一个字典而不是一个字符串,一切似乎都正常了。
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"元素定义)。

这是一个json字符串。但是由于使用json.loads(s)无法正常工作,我尝试在加载之前将其转储并成功了。但问题在于'final_price'中的40后面有一个尾随逗号。删除它解决了问题。感谢您的建议。 - Zid
1
那就是我的观点 - 加上额外的逗号后,它不再是有效的JSON格式,因此将其传递给json.loads函数会出现错误,报告为json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 10 column 9 (char 215)。无论如何,很高兴问题已经解决。 - holdenweb
1
你是对的。虽然之前它是JSON字符串,但现在不再是了。实际上,它是我从json.dumps(json_obj)获得的大型JSON字符串的子集。在notepad++中编辑它留下了那个尾随逗号。 - Zid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接