2013-07-03 85 views
0

目前我正在試圖創建從一個JSON格式的服務器響應的字典:解碼JSON數據到Python字典

{"id": null,{"version": "1.1","result": "9QtirjtH9b","error": null}} 

因此我使用json.loads()。但是,我總是得到以下錯誤:

ValueError: Expecting property name: line 1 column 12 (char 12) 

我知道,這意味着在JSON語法錯誤,我發現了一些線索(像this one)在這裏計算器,但他們並沒有包括回答解決了我的問題。

但是,我不確定json響應中的值是否會導致錯誤,所以我仔細看了下json.org Reference Manual,它似乎是一個有效的語法。有任何想法嗎?

回答

0

這裏的問題是缺乏嵌套的對象,而不是null關鍵的。您需要找到一種方法來修復該語法或自己解析它。

如果我們做出關於語法的幾個假設,你應該能夠使用正則表達式解碼之前解決JSON數據:

import re 
from itertools import count 

def _gen_id(match, count=count()): 
    return '{1}"generated_id_{0}":{2}'.format(next(count), *match.groups()) 

_no_key = re.compile(r'(,)({)') 

def fix_json(json_data): 
    return _no_key.sub(_gen_id, json_data) 

這假定任何,{組合指示的位置一個丟失的鍵,並生成一個插入那裏。這是一個合理的假設,但如果你有正好那個序列的字符串數據可能會破壞事情。

演示:

>>> json_data = '{"id": null,{"version": "1.1","result": "9QtirjtH9b","error": null}}' 
>>> fix_json(json_data) 
'{"id": null,"generated_id_0":{"version": "1.1","result": "9QtirjtH9b","error": null}}' 
>>> json.loads(fix_json(json_data)) 
{u'id': None, u'generated_id_1': {u'version': u'1.1', u'result': u'9QtirjtH9b', u'error': None}} 
+0

謝謝,現在有一些修復它的作品! – Phidelux

2

這是無效的。外部對象需要第二個元素的屬性名稱;原始值在對象中無效。

{"id": null, "somename":{"version": "1.1","result": "9QtirjtH9b","error": null}} 
+0

好吧,我錯過了。但是我怎麼能在不知道結果的確切結構的情況下將自己的對象名添加到這樣的結果中呢?我無法強制服務器創建有效的響應,因此我必須自己修復它,但我不知道服務器的確切格式規則。 – Phidelux

+0

你將不得不蠻力解析字符串。 –

+0

由於在json解析器解析字符串時引發錯誤,因此無法直接處理。最好的方法是編寫你自己的解析器,或者你可以編寫一個函數來接收字符串並進行檢查,並在用'json'解析之前進行精確的修改。 – FallenAngel