【问题标题】:Issues with trying to parse JSON into a dictionary尝试将 JSON 解析为字典的问题
【发布时间】:2021-12-14 18:11:24
【问题描述】:

当我尝试将此 JSON 字符串转换为 Python 字典时,我不断收到无效的转义错误。下面是代码和回溯。这适用于发送比这更多信息的 API,但这是我在保持相同错误的同时将其缩减为的内容。我在这个字符串中同时使用了 \\ 和 \ 并得到了相同的结果。

import json 

work_orders_inprogress = '''
{
    "ItemCollection": [
        {
            "Header": {
                "ID": "work_orderID",
                "CreationTime": "2021-03-17T12:12:47.02-04:00",
                "DeletionTime": "0001-01-01T00:00:00",
                "DeletionTimeSpecified": true,
                "LastModifiedTime": "2021-10-29T12:12:23.73-04:00",
                "LastModifiedBy": "Mit_rando.Province\\First Last"
            },
            "ID": "work_orderID",
            "Type": "WorkOrder",
            "ScheduledTime": "2021-03-19T12:06:00.937-04:00",
            "PromisedTime": "2021-06-01T19:00:00-04:00",
            "InvoiceTime": "0001-01-01T00:00:00",
            "WorkOrderNumber": 35659,
            "InvoiceNumber": 0,
            "PurchaseOrderNumber": "",
            "Contact": {
                "Header": {
                    "ID": "work_orderID",
                    "CreationTime": "2021-03-09T13:00:06.77-05:00",
                    "DeletionTime": "0001-01-01T00:00:00",
                    "DeletionTimeSpecified": true,
                    "LastModifiedTime": "2021-08-30T15:21:28.25-04:00",
                    "LastModifiedBy": "Mit_rando.province\\First Last"
                },
                "ID": "work_orderID",
                "FileAs": "Business - CASH CUSTOMER",
                "Name": {
                    "Title": "Manager",
                    "Prefix": "",
                    "FirstName": "First",
                    "MiddleName": "",
                    "LastName": "Last",
                    "Suffix": ""
                },
                "Address": {
                    "Title": "Business",
                    "ID": "work_orderID",
                    "Street": "some random st",
                    "City": "cityname",
                    "Province": "XX",
                    "PostalCode": "XXXXX",
                    "Country": "USA"
                },
                "Company": "Company Name - CASH CUSTOMER",
                "Phone1Title": "Business",
                "Phone1": "(720) fakenumber",
                "Phone2Title": "Cell",
                "Phone2": "(303) fakenumber",
                "EmailTitle": "Email",
                "Email": "fake@email.org",
                "PreferredContactMethod": "Email",
                "MarketingSource": "",
                "Note": "",
                "NoMessaging": false,
                "NoEmail": false,
                "NoPostCard": false
            }
        }
    ]
}
'''

data = json.loads(work_orders_inprogress)

print(type(data))

错误:

Traceback (most recent call last):
  File "<string>", line 70, in <module>
File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid \escape: line 11 column 54 (char 386)

我什至尝试在在线编译器上运行它并得到相同的结果。谢谢!

【问题讨论】:

  • 所以,问题在于 "\" 是 Python 文字的转义序列,所以你会得到一个像 "Mit_rando.Province\First Last" 这样的字符串,这对于 JSON 来说不是有效的转义序列,所以你要么想要 "Mit_rando.Province\\\\First Last" 之类的东西,要么使用 Python 字符串文字的原始字符串(可能最简单)

标签: python json string dictionary


【解决方案1】:

问题在于反斜杠。尝试获取原始字符串:

work_orders_inprogress = r'''...

【讨论】:

  • 答案再加一点,在python中true和false应该是True和False。
  • @VimalanE 它是 JSON。应该是truefalse的地方,如果大写就不是有效的JSON
  • title 说需要转换成python字典,我可以看到json中的布尔值很少,转换时它应该是字符串还是python布尔值,对吗?
  • @VimalanE,这是不正确的。在 JSON 中为 true,在从 json 数据制作 python 字典时将转换为 True。
  • @VimalanE 你说得对,布尔值在 Python 中取值 TrueFalse。但是,就像其他人指出的那样,我们在这里读取 json 并且 json 模块确保值在 python 中被正确解释。从 OP 的代码中尝试print(data["ItemCollection"][0]["Contact"]["NoEmail"])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多