python - 带有转义字符的 json.loads() python3
问题描述
我有来自 kinesis 流的数据,它有转义字符。当我尝试使用 json.loads 在 python3 中将该数据转换为 json 格式时,它失败了json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 22 (char 21)
示例事件如下,
event='{"logEvents":[{"message":"{\"objectType\":\"HANDLER_OBJECT\",\"event\":{\"source\":\"Test\",\"action\":\"PLAY\",\"type\":\"SH\",\"timestamp\":1576223901848,\"key\":\"A|12|B|12|C|123|R|1|SH\",\"value\":\"{\\\"type\\\":\\\"THIS_IS_TEST\\\",\\\"objectId\\\":\\\"123ae43fd46fg\\\",\\\"containerId\\\":\\\"122122321212343212\\\",\\\"testId\\\":\\\"0\\\",\\\"testContainerId\\\":\\\"122122321212343212\\\",\\\"version\\\":4,\\\"reattemptVersion\\\":1,\\\"pId\\\":\\\"122122321212343212|123ae43fd46fg\\\",\\\"active\\\":true,\\\"sOn\\\":1576222508,\\\"cOn\\\":0,\\\"time\\\":1576226109,\\\"hIds\\\":[],\\\"mScore\\\":4000,\\\"cy\\\":null,\\\"ceOn\\\":null,\\\"rr\\\":[],\\\"cS\\\":null}\"}}"}]}'
我试过的代码,
json.loads(event)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 29 (char 28)
我知道转换\
可以\\
解决这个问题,但有时特殊字符也会出现,因此不能仅使用替换来处理。
我还检查了类似的 SO 问题和解决方案,但没有一个有效。我试过了,json.loads(event.encode('unicode_escape'))
但json.loads(r'{}'.format(event))
没有一个奏效。任何人都可以在 python3 中提供解决方案或更好的 json 解析模块/库吗?
解决方案
我不确定数据来自哪里,但是!但我们来了!
import json
event = r'{"logEvents":[{"message":"{\"objectType\":\"HANDLER_OBJECT\",\"event\":{\"source\":\"Test\",\"action\":\"PLAY\",\"type\":\"SH\",\"timestamp\":1576223901848,\"key\":\"A|12|B|12|C|123|R|1|SH\",\"value\":\"{\\\"type\\\":\\\"THIS_IS_TEST\\\",\\\"objectId\\\":\\\"123ae43fd46fg\\\",\\\"containerId\\\":\\\"122122321212343212\\\",\\\"testId\\\":\\\"0\\\",\\\"testContainerId\\\":\\\"122122321212343212\\\",\\\"version\\\":4,\\\"reattemptVersion\\\":1,\\\"pId\\\":\\\"122122321212343212|123ae43fd46fg\\\",\\\"active\\\":true,\\\"sOn\\\":1576222508,\\\"cOn\\\":0,\\\"time\\\":1576226109,\\\"hIds\\\":[],\\\"mScore\\\":4000,\\\"cy\\\":null,\\\"ceOn\\\":null,\\\"rr\\\":[],\\\"cS\\\":null}\"}}"}]}'
def to_python(event):
event = eval(event)
for e in event['logEvents']:
e['message'] = json.loads(e['message'])
e['message']['event']['value'] = json.loads(e['message']['event']['value'])
return event
from pprint import pprint
pprint(to_python(event))
输出
{'logEvents': [{'message': {'event': {'action': 'PLAY',
'key': 'A|12|B|12|C|123|R|1|SH',
'source': 'Test',
'timestamp': 1576223901848,
'type': 'SH',
'value': {'active': True,
'cOn': 0,
'cS': None,
'ceOn': None,
'containerId': '122122321212343212',
'cy': None,
'hIds': [],
'mScore': 4000,
'objectId': '123ae43fd46fg',
'pId': '122122321212343212|123ae43fd46fg',
'reattemptVersion': 1,
'rr': [],
'sOn': 1576222508,
'testContainerId': '122122321212343212',
'testId': '0',
'time': 1576226109,
'type': 'THIS_IS_TEST',
'version': 4}},
'objectType': 'HANDLER_OBJECT'}}]}
推荐阅读
- azure-machine-learning-studio - 在调用 Azure 机器学习函数时在 Azure 流分析中出现错误请求结果,即使从 C# 调用 Azure ML 服务也很好
- linux - 根本无法让 Crontab 工作正常工作
- javascript - 根据下拉选项更改多个输入字段的值(js 或 PHP 开关)
- wpf - 列表框中的 WPF Wrappanel
- linux - 配置 NGINX 时如何使用环境变量作为前缀路径?
- android - 如何在 addMultipartParts Ion Koush 库中发送键值?
- r - 在 R plotly 散点图中更改标记颜色
- docker - 无法在 docker 中构建 golang 应用程序
- java - NotificationCompat.Builder - 'java.util.Iterator java.util.List.iterator()' NPE
- android - 将导航视图上的项目设置为从片段中选择