首页 > 解决方案 > 带有转义字符的 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 解析模块/库吗?

标签: pythonjsonpython-3.xjsonparser

解决方案


我不确定数据来自哪里,但是!但我们来了!

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'}}]}

推荐阅读