【问题标题】:json.loads() returns a stringjson.loads() 返回一个字符串
【发布时间】:2019-11-06 04:46:00
【问题描述】:

为什么 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前后的引号,{}resp.
  • { "reference": "123432", "business_date": "2019-06-18", "final_price": 40, "products": [ { "quantity": 4, "original_price": 10, "final_price": 40, } ] } JSON 数据 Invalid JSON: Expecting property name enclosed in double quotes: line 10 column 9 (char 215) None [Program finished]未来读者评论

标签: python json python-3.x python-3.6


【解决方案1】:

两点:

  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 规范不允许尾随逗号。有一些浏览器允许它,但通常你需要担心所有浏览器。

【讨论】:

  • 逗号不会影响python中的结果。
  • d = {'a':10,}d = {'a':10} 。两者都会给出相同的结果。 Python 不区分大小写。在你的机器上试试
  • json.loads('{"a":[10,]}') vs json.loads('{"a":[10]}') ?
  • 你是对的。我从没想过。我今天学到了一些新东西。
【解决方案2】:

ast.literal_eval: 安全地评估表达式节点或包含 Python 文字或容器显示的字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、字节、数字、元组、列表、字典、集合、布尔值、无、字节和集合。 more details

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

【讨论】:

    【解决方案3】:

    在您的代码中,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 宽容,并且不允许在列表和 dicts 末尾悬挂逗号(请参阅"final_price"元素定义)。

    【讨论】:

    • 是一个json字符串。但由于它不能简单地与 json.loads(s) 一起工作,我试图在加载它之前转储它并且它有效。但问题是“final_price”中 40 之后的尾随逗号。删除它解决了这个问题。感谢您的意见。
    • 这就是我的观点 - 使用额外的逗号,它不再是有效的 JSON,因此将其传递给 json.loads 时会出现 json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 10 column 9 (char 215) 错误。无论如何,很高兴它已经解决了。
    • 你是对的。它不再是 json 字符串,尽管它更早。实际上它是我从 json.dumps(json_obj) 得到的一个大 json 字符串的一个子集。在记事本++中编辑它留下了尾随的逗号。
    【解决方案4】:

    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 格式的原因。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2012-10-15
      相关资源
      最近更新 更多