2012-09-20 18 views
6

我想知道是否有解碼類似JSON的字符串的方法。如何在Python中解碼無效的json字符串

我得到的字符串:

'{ hotel: { id: "123", name: "hotel_name"} }' 

這不是一個有效的JSON字符串,所以我不能直接使用Python API進行解碼。 Python將只接受一個字符串化JSON字符串,如:

'{ "hotel": { "id": "123", "name": "hotel_name"} }' 

,其屬性引用是一個字符串。

回答

9

使用demjson模塊,該模塊具有在非嚴格模式下解碼的能力。

In [1]: import demjson 
In [2]: demjson.decode('{ hotel: { id: "123", name: "hotel_name"} }') 
Out[2]: {u'hotel': {u'id': u'123', u'name': u'hotel_name'}} 
+0

不知道該模塊 - 必須檢查那出來+ 1 –

+0

整潔,會用這個模塊! +1。 – Aesthete

+0

蟒蛇自定義模塊的海.... – u8y7541

3

你可以嘗試和使用包裝的JavaScript引擎,like pyv8.

import PyV8 
ctx = PyV8.JSContext() 
ctx.enter() 
# Note that we need to insert an assignment here ('a ='), or syntax error. 
js = 'a = ' + '{ hotel: { id: "123", name: "hotel_name"} }' 
a = ctx.eval(js) 
a.hotel.id 
>> '123' # Prints 
0

不是很優雅,而不是穩健的(不易破損),但有可能以雜牌它的東西,如:

kludged = re.sub('(?i)([a-z_].*?):', r'"\1":', string) 
# { "hotel": { "id": "123", "name": "hotel_name"} } 

您可能會發現使用pyparsingparsePythonValue.py例子可以做你想做以及什麼...(或者很容易修改,這樣做)或jsonParser.py可以修改不需要引用鍵值。

+0

從downvoter的解釋將是很好... –

1

@vartec已指出demjson,這對於輕微無效JSON效果很好。對於這甚至更少JSON兼容的數據我已經寫了barely_json

from barely_json import parse 
print(parse('[no, , {complete: yes, where is my value?}]')) 

打印

[False, '', {'complete': True, 'where is my value?': ''}]