我正在尝试使用以下代码读取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]]}
因为c10
是null
。事实上我可以null
或None
有办法处理这两种情况吗?
答案 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)
当然,如果您的字符串中同时包含None
和null
,则该方法无法正常工作。您必须使用replace
...
答案 1 :(得分:0)
在加载之前,只需将您的dict转换为JSON字符串:
json.loads(json.dumps(data))
它会自动将所有None
转换为null
&#39>