python - json.loads() ValueError: Expecting , delimiter 有两个值设置为 000
问题描述
我正在解析每行都是 json 字符串的日志文件。这是两个示例,一个适用于 json.loads(python 2.7 或 python 3.7),另一个因分隔符错误而失败。唯一的区别是键的值:“cache_response_code”和“server_response”
如果值为 000,则出错,如果是正常的 HTTP 响应,如“404”,则没有问题。如果该值设置为 0,它也可以工作。仅当值为 00 或 000 或任何多个 0 值时才会失败。
为什么 ?
例子:
import json
line1 = '{"localtimestamp": "18/Mar/2020:13:39:04 -0400", "client_ip":"10.247.69.247", "cache_response":"ERR_INVALID_URL", "cache_response_code":404, "request_page":"http://10.247.135.122/", "server_response":404, "bytes":297, "user_agent":"-", "sessionId": "-", "origin_response_time": 0, "client_response_time": 0, "ssl_connection": 0, "referrer": "-"}'
line_json1 = json.loads(line1)
line2 = '{"localtimestamp": "18/Mar/2020:13:39:09 -0400", "client_ip":"10.247.69.247", "cache_response":"ERR_UNKNOWN", "cache_response_code":000, "request_page":"/", "server_response":000, "bytes":0, "user_agent":"-", "sessionId": "-", "origin_response_time": 0, "client_response_time": 5001, "ssl_connection": 0, "referrer": "-"}'
line_json2 = json.loads(line2)
解释器中的输出:
>>> import json
>>>
>>> line1 = '{"localtimestamp": "18/Mar/2020:13:39:04 -0400", "client_ip":"10.247.69.247", "cache_response":"ERR_INVALID_URL", "cache_response_code":404, "request_page":"http://10.247.135.122/", "server_response":404, "bytes":297, "user_agent":"-", "sessionId": "-", "origin_response_time": 0, "client_response_time": 0, "ssl_connection": 0, "referrer": "-"}'
>>> line_json1 = json.loads(line1)
>>>
>>> line2 = '{"localtimestamp": "18/Mar/2020:13:39:09 -0400", "client_ip":"10.247.69.247", "cache_response":"ERR_UNKNOWN", "cache_response_code":000, "request_page":"/", "server_response":000, "bytes":0, "user_agent":"-", "sessionId": "-", "origin_response_time": 0, "client_response_time": 5001, "ssl_connection": 0, "referrer": "-"}'
>>> line_json2 = json.loads(line2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 134 (char 133)
解决方案
我找到了一个优雅的解决方案来解决我的问题。而不是 json,我使用 ast
import ast
line1 = '{"cache_response_code":404, "referrer": "-"}'
line1_dict = ast.literal_eval(line1)
line2 = '{"cache_response_code":000, "referrer": "-"}'
line2_dict = ast.literal_eval(line2)
我真正的代码是:
if files_dict:
for file in files_dict.values():
with open(file) as f:
lines = f.readlines()
for line in lines:
line = ast.literal_eval(line)
推荐阅读
- python - Python,编写 XML 文件 - 'charmap' 编解码器无法编码字符。包含要修复的编码时,get 必须是 str,而不是 bytes
- javascript - 如何确定正常矩形和旋转矩形之间是否存在碰撞?
- javascript - (JavaScript) 从用户输入框中查找圆的面积
- amazon-web-services - 在安全性方面使用 ec2 复制亚马逊工作场所
- asp.net-core-webapi - 带有 EF 核心的 Identity Server 4
- reactjs - 使用 SearchWidget 点击结果后如何防止SuggestedResult 崩溃?
- python - 在循环中制作字典时,当键可以在每次循环迭代中更改时,如何将数据写入 CSV?
- hibernate - JPA嵌入常量值
- c++ - `sizeof(std::max_align_t)` 有实际意义吗?
- android - 如何更改 Android 弹出菜单的背景颜色?