首页 > 解决方案 > 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)

标签: pythonjsondelimitervalueerror

解决方案


我找到了一个优雅的解决方案来解决我的问题。而不是 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)

推荐阅读