2017-03-01 48 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

哇感謝!我同意你的看法,我應該向第三方報告,而不是做黑客 –