2012-02-01 68 views
6

我感興趣的有simplejson.loads()成功解析如下:有什麼辦法可以讓simplejson不那麼嚴格?

{foo:3} 

它拋出一個JSONDecodeError說:「期待的屬性名稱」,但在現實中它是說:「我需要在我的屬性名雙引號」。這對我的用例來說很煩人,我寧願不那麼嚴格的行爲。我已經閱讀過文檔,但除了製作我自己的解碼器類外,我沒有看到任何明顯改變這種行爲的東西。

+1

所以,你想'simplejson'接受一些無效的JSON嗎? (這是JavaScript的地方引號是可選的。在JSON他們是強制性的。) – millimoose 2012-02-01 23:26:43

+0

是啊,這就是我想要的東西。 :) – slacy 2012-02-01 23:29:28

+0

我暗示的是「這是你不應該想要的東西。」 – millimoose 2012-02-01 23:31:10

回答

10

您可以使用YAML(> = 1.2),因爲它是JSON的超集,你可以這樣做:

>>> import yaml 
>>> s = '{foo: 8}' 
>>> yaml.load(s) 
{'foo': 8} 
+0

哇,這正是我想要的。謝謝! – slacy 2012-02-01 23:36:58

+1

@slacy我剛剛注意到yaml需要冒號後有一個空格。我認爲這會破壞你的派對。 – RanRag 2012-02-01 23:38:38

+1

它的確如此,除非RHS是一個數組。 {foo:[bar]}很好,這實際上就是我正在做的。 – slacy 2012-02-01 23:41:20

1

不,這是不可能的。要成功解析使用simplejson,您首先需要將其轉換爲有效的JSON字符串。

根據您輸入的字符串的格式如何嚴格的是,這可能是非常簡單或非常複雜。

對於一個簡單的例子,如果你將永遠有一個JSON對象,只有字母和鍵突出(不帶引號)和整數作爲值,你可以使用下面將其轉化爲有效的JSON:

import re 
your_string = re.sub(r'([a-zA-Z_]+)', r'"\1"', your_string) 

例如:

>>> re.sub(r'([a-zA-Z_]+)', r'"\1"', '{foo:3, bar:4}') 
'{"foo":3, "bar":4}' 
2

您可以嘗試demjson

>>> import demjson 
>>> demjson.decode('{foo:3}') 
{u'foo': 3} 
相關問題