2017-03-01 60 views
3
解析错误

我发送到API的请求,并返回该JSON响应JSON字符串在Python

'{"Reply":{"Header":{"Method":"mGSSCBetHistory","ErrorCode": "0","MerchantID":"BETSTARtest","MessageID": "H140201152657m6k3f"},"Param":{"TotalRecord":"1","BetDatas":"[{"Column1":""}]","ErrorDesc": ""}}}' 

当我尝试将其转换为字典是否ast.literal_evaljson.loads它返回此错误:

Traceback (most recent call last): 
    File "/Users/deanchristianarmada/Desktop/projects/asian_gaming/radar/lib/python2.7/site-packages/celery/app/trace.py", line 367, in trace_task 
    R = retval = fun(*args, **kwargs) 
    File "/Users/deanchristianarmada/Desktop/projects/asian_gaming/radar/lib/python2.7/site-packages/celery/app/trace.py", line 622, in __protected_call__ 
    return self.run(*args, **kwargs) 
    File "/Users/deanchristianarmada/Desktop/projects/asian_gaming/radar/provider/KENO/tasks.py", line 127, in run 
    ['Reply', 'Param', 'BetDatas'], 'post') 
    File "/Users/deanchristianarmada/Desktop/projects/asian_gaming/radar/core/classes.py", line 217, in check_records 
    self.result = response.json() 
    File "/Users/deanchristianarmada/Desktop/projects/asian_gaming/radar/lib/python2.7/site-packages/requests/models.py", line 826, in json 
    return complexjson.loads(self.text, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, 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 382, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting ',' delimiter: line 1 column 169 (char 168) 

这样做的原因是因为它有一个双引号双引号内..有一个简单的解决方法这个BetDatas的价值?因为我能想到的唯一适当的解决方案是告诉第三方,我一直在发送请求来更改他们的JSON响应。

+0

耶对其无效JSON。 – Craicerjack

回答

2

如果排除“BetDatas”你猜对了,然后它解析正确

import json 
json.loads('{"Reply":{"Header":{"Method":"mGSSCBetHistory","ErrorCode": "0","MerchantID":"BETSTARtest","MessageID": "H140201152657m6k3f"},"Param":{"TotalRecord":"1","ErrorDesc": ""}}}') 

{u'Reply': {u'Header': {u'ErrorCode': u'0', u'MessageID': u'H140201152657m6k3f', u'Method': u'mGSSCBetHistory', u'MerchantID': u'BETSTARtest'}, u'Param': {u'ErrorDesc': u'', u'TotalRecord': u'1'}}}

有处理这种没有明显的方式,这取决于API提供商纠正他们的JSONs。

3

使用正则表达式匹配错误的值,并使用re.sub逃脱了这场比赛。

import re 
import json 

data = '{"Reply":{"Header":{"Method":"mGSSCBetHistory","ErrorCode": "0","MerchantID":"BETSTARtest","MessageID": "H140201152657m6k3f"},"Param":{"TotalRecord":"1","BetDatas":"[{"Column1":""}]","ErrorDesc": ""}}}' 

def escape(match_obj): 
    print(match_obj.group(1)) 
    return match_obj.group(1).replace('"','\"') 
REGEX = '(?<="BetDatas":")(\S+)(?=",)' 

data = re.sub(REGEX, escape, data) 
print(data) 
+1

虽然这可能是一个解决办法发挥作用,更安全的解决方案是与第三方联系,并告诉他们,他们正在返回无效JSON。 因为他们没有在这种特定情况下特殊字符转义,很可能是因为他们不这样做,一般情况下,可能需要你在的地方在未来增加更多的黑客。 – sxn

+1

@sxn同意。一个新的请求很容易打破这种黑客 – Crispin

+0

哇感谢!我同意你的看法,我应该向第三方报告,而不是做黑客 –