2013-05-20 22 views
4

我有一個字符串,基本上包含了一串JSON格式的文本,我最終希望以「漂亮打印」格式導出到適合嵌套的縮進格式的Excel。將字符串轉換爲有序字典?

原始命令爲了便於閱讀,保留鍵/值。我想要完成我想要的任務是

a)使用類似eval的字符串將字符串轉換爲字典並使用集合庫中的OrderedDict保持順序不變。

但是我沒有得到預期的結果:

In [21]: json_string = str({"id":"0","last_modified":"undefined"}) 
In [22]: OrderedDict(eval(json_string)) 
Out[23]: OrderedDict([('last_modified', 'undefined'), ('id', '0')]) 

我也還沒有完全想通了,可是我該怎麼去寫的輸出漂亮的打印格式出類拔萃,但我希望這會是比較容易的部分!

回答

15

可以使用object_pairs_hook參數JSONDecoder改變解碼的詞典來OrderedDict:

import collections 
import json 

decoder = json.JSONDecoder(object_pairs_hook=collections.OrderedDict) 

json_string = '{"id":"0","last_modified":"undefined"}' 
print decoder.decode(json_string) 
json_string = '{"last_modified":"undefined","id":"0"}' 
print decoder.decode(json_string) 

此打印:

OrderedDict([(u'id', u'0'), (u'last_modified', u'undefined')]) 
OrderedDict([(u'last_modified', u'undefined'), (u'id', u'0')]) 
+1

嗯...呃...這顯然比我的回答好... – mgilson

+0

呵呵,那麼總有不止一種方法來皮膚貓:) – jterrace

+1

但有些方法比其他人更清潔...我仍然辯論刪除我的。它至少是解析python語法的一個很好的例子,但我不知道是否有理由讓它變得更好, – mgilson

5

首先,您應該考慮使用json(或甚至ast.literal_eval)而不是eval

其次,這不起作用,因爲一分鐘你把它變成一個普通的字典,所有的訂單都會丟失。如果你想把信息放入OrderedDict中,你需要自己解析「json」。

幸運的是,這並不像您使用ast模塊時那樣困難。在這裏,我假設字典只包含字符串,但爲了其他目的而修改應該不會太難。

s = '{"id":"0","last_modified":"undefined"}' 
import ast 
from collections import OrderedDict 
class DictParser(ast.NodeVisitor): 
    def visit_Dict(self,node): 
     keys,values = node.keys,node.values 
     keys = [n.s for n in node.keys] 
     values = [n.s for n in node.values] 
     self.od = OrderedDict(zip(keys,values)) 

dp = DictParser() 
dp.visit(ast.parse(s)) 
ordered_dict = dp.od 
print ordered_dict 
+0

嗯,我認爲這可能是這種情況。也許最好是使用正則表達式重新格式化JSON字符串(即用換行符替換逗號等) – ChrisArmstrong

+0

堅持...我正在做點什麼... – mgilson

+0

+1爲了樂趣! – jterrace