2013-11-02 83 views
0

我正在做一件非常類似於this user was doing的東西:嘗試將一個javascript對象聲明加載到python字典中。但是,與該用戶不同,屬性名稱不包含在引號中。解析不使用字符串屬性名稱的javascript對象聲明

>>> simplejson.loads('{num1: 1383241561141, num2: 1000}') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/lalalal/site-packages/simplejson/__init__.py", line 385, in loads 
    return _default_decoder.decode(s) 
    File "/Users/lalalal/site-packages/simplejson/decoder.py", line 402, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Users/lalalal/site-packages/simplejson/decoder.py", line 418, in raw_decode 
    obj, end = self.scan_once(s, idx) 
simplejson.decoder.JSONDecodeError: Expecting property name: line 1 column 1 (char 1) 

這將會是剛剛輝煌,如果我有正確的JSON對象:

>>> simplejson.loads('{"num1": 1383241561141, "num2": 1000}') 
{'num1': 1383241561141, 'num2': 1000} 

但是,我不知道。我該如何解決這個問題?也許它歸結爲像正則表達式一樣簡單?

編輯This regex說的Martijn寫有我一半了,只是如果我有這發生在我的一些示例數據,例如的括號後尾隨空白不起作用{ num1: 1383241561141, num2: 1000}'

+0

我會使用正則表達式來引用鍵,然後將其解析爲JSON。 (/,(\ w)+:/ g,',「$ 1」:'),然後使用字符串方法手動清理第一個和最後一個鍵的字符串。這樣,JSON仍然可以完成繁重的工作,而且您只需要以可預測的方式清理一些可預測的字符串。 – dandavis

+0

@dandavis這段代碼應該是什麼?調用're.sub'? – 2rs2ts

+1

它的參數調用JS的替換方法。 python應該有一些相關的東西,從我使用python的時候就已經很久了,原諒了我。 – dandavis

回答

0

一些類似RSON的庫支持解析所謂的「寬鬆」JSON表示法。

根據實際的密鑰,如果您不關心安全隱患(從不在外部輸入中使用此密鑰),eval也可能會爲您提供功能詞典。

+0

我不想使用另一個庫,不幸的是,在這種情況下我不能使用'eval'(不安全!)。但是,謝謝你。 – 2rs2ts

+0

我無法在純Python中找到解決方案,所以我接受了這個答案,因爲它會爲其他人解決問題。 – 2rs2ts

0

一個簡單的方法來做到這一點的JS:

'{num1: 1383241561141, num2: 1000}' // the string 
    .trim()        // remove whitespace 
    .slice(1,-1)      // remove endcap braces 
    .trim()        // remove whitespace 
    .split(/\s*,\s*/).map(function(a){ // loop through each comma section names as a 
    var p=a.split(/\s*:\s*/);  // split section into key/val segments 
    this[p[0]]=p[1];     // assign val to collection under key 
    return this;      // return collection 
},{})[0];        // grab the return once (same on each index) 

這個例程返回該stringifys像這樣的活動對象:,你又可以通過對象循環

{ 
    "num1": "1383241561141", 
    "num2": "1000" 
} 

音符串號和數字(val)這些鍵返回到實際的數字,如果需要的話。

+0

不幸的是,我不得不在Python中這樣做,但感謝你的JS代碼:) – 2rs2ts

+0

啊,我沒有看到你需要它在Python中......好吧,現在你可以看到一個可以運行的例程,把它翻譯成python。我知道Python有你需要的部分,這是6行代碼? – dandavis

+0

是的,確切地說。不過,我認爲我必須擔心我的val字符串中的逗號和冒號。我可能會錯過那些'split'在javascript中工作(我是新手),但是,我認爲他們會在這裏絆倒,對吧? – 2rs2ts

相關問題