尝试将字符串转换为JSON时出错 - python

时间:2018-04-17 08:38:38

标签: python json

我正在尝试使用以下代码读取JSON格式的字符串:

data="""{"values": [["c1", 1], ["c2", 6.6], ["c3", 0], ["c4", 0.0066], ["id", 2005742774], ["c5", 1814278934], ["c6", 1000184], ["c7", "2018-04-06 17:18:23"], ["c8", "2018-04-06 17:18:23"], ["c9", "2018-04-06 17:18:23"]]}"""

json.loads(data)

在这种情况下这很好用,但是当字符串包含None时,会引发错误。这是导致问题的字符串:

{"values": [["a1", None], ["a2", "https://aaaa.com"], ["a3", "test"], ["a4", None], ["a5", 1814278940], ["a6", "AKJHGDKHG"], ["a7", None], ["dateCreated", "2018-03-06 17:18:39"], ["page_id", 772430], ["dateModified", "2018-03-06 17:18:39"], ["a8", 1]]}

这是我得到的错误:

raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 28 (char 27)

修改

正如 @ Jean-FrançoisFabre建议的那样,我使用ast.literal_eval并且它适用于上面提到的示例,但不适用于以下示例:

{"values": [["a1", "hgjhgkjh"], ["url", "https://example.com"], ["c5", "5464"], ["c4", "39446489"], ["c3", 1814308464], ["session", "AILGHGH"], ["c10", null], ["dateCreated", "2018-03-06 17:23:55"], ["page", 771790], ["dateModified", "2018-03-06 17:23:55"], ["device_id", 168]]}

因为c10null。事实上我可以nullNone有办法处理这两种情况吗?

2 个答案:

答案 0 :(得分:0)

json null null,而不是None。您的字符串不是JSON,而是将本机Python字典转换为字符串。

在这种情况下,json.load的替代ast.literal_eval

import ast
x = """{"values": [["a1", None], ["a2", "https://aaaa.com"], ["a3", "test"], ["a4", None], ["a5", 1814278940], ["a6", "AKJHGDKHG"], ["a7", None], ["dateCreated", "2018-03-06 17:18:39"], ["page_id", 772430], ["dateModified", "2018-03-06 17:18:39"], ["a8", 1]]}"""
d = ast.literal_eval(x)

如果你希望能够接受原生的python和amp; json格式,您可以在第一个方法上捕获异常并尝试另一个方法:

import ast,json

def load_anything(s):
    try:
        return ast.literal_eval(s)
    except ValueError:
        return json.loads(s)

当然,如果您的字符串中同时包含Nonenull,则该方法无法正常工作。您必须使用replace ...

答案 1 :(得分:0)

在加载之前,只需将您的dict转换为JSON字符串:

json.loads(json.dumps(data))

它会自动将所有None转换为null&#39>