2016-06-24 128 views
-1

在JSON字典中每一個關鍵值我有一個JSON字符串:迭代通過在Python

{"emailId":[],"Age":[],"siblings":[],"addedGroupIds":[],"role":{"name":"x","description":"y","Permissions":[],"clientId":102}} 

我想從每一個鍵值對替換值(除非值本身是一本字典,如:「角色「)。我將上述字符串轉換爲somerandomFunc()中的字典,然後將此字典發送給iterator()。 Iterator()將遞歸地檢查每個鍵值對中的值是否是字典。如果該值不是字典,它將把鑰匙smartScanner(),我將與myTestString被替換收到鍵的值

def somerandomfunc(self,JSONString): 
    payload=simplejson.loads(JSONString) 
    self.payload=payload 
    iterator(payload) 

def iterator(self,payload): 
    for i in payload: 
     if isinstance(payload[i],dict): 
      self.iterator(payload[i]) 
     else: 
      self.smartScanner(i) 

def smartScanner(self,i): 
    mytestString='">qqqq' 
    if (self.payload.has_key(i)): 
     self.payload[i]=mytestString 
    print "%s:%s"%(i,self.payload.has_key(i)) 

我得到以下輸出:

existingGroupIds:True 
existingUserIds:True 
assetPermissions:False 
name:False 
clientId:False 
description:False 
removedGroupIds:True 
removedUserIds:True 
addedGroupIds:True 
addedUserIds:True 

這意味着如果smartScanner()中的語句對於「assetPermissions」,「name」,「clientId」和「description」鍵失敗。我無法用myteststring替換這些鍵的值。我可以理解它失敗的原因是因爲它試圖訪問有效載荷[「名稱」]而不是有效載荷[「角色」] [「名稱」]

如何更改我的邏輯,以便能夠替換甚至對於「assetPermissions」,「name」,「clientId」和「description」鍵值?而且我的程序不會破壞,無論JSON有效載荷中是否存在字典的任何層次結構

+0

什麼是self.payload?這個實例屬性與有效載荷不同嗎?順便說一句,在python中,通常我們不會在括號中包括if條件,除非它們是有用的,否則某個習慣於閱讀python的人會期望它做某事。 –

+0

我想用myTestString替換值「x」,「y」和「102」@PadraicCunningham –

+0

是的,我的程序因嵌套字典失敗。我可以替換鍵「電子郵件」,「年齡」等的值。但不是「assetPermissions」,「name」,「clientId」和「description」@PadraicCunningham –

回答

0

我相信你用「smartscanner」函數過度複雜化了它。這裏有一個方法,不使用類,但你應該能夠將其轉換爲一個類的方法很容易:

In [16]: example = {"emailId":[],"Age":[],"siblings":[],"addedGroupIds":[],"role":{"name":"x","description":"y","Permissions":[],"clientId":102}} 

In [17]: def iterator(payload): 
    ...:  for i in payload: 
    ...:   if isinstance(payload[i],dict): 
    ...:    iterator(payload[i]) 
    ...:   else: 
    ...:    payload[i] = '">qqqq' 
    ...:    

In [18]: iterator(example) 

In [19]: example 
Out[19]: 
{'Age': '">qqqq', 
'addedGroupIds': '">qqqq', 
'emailId': '">qqqq', 
'role': {'Permissions': '">qqqq', 
    'clientId': '">qqqq', 
    'description': '">qqqq', 
    'name': '">qqqq'}, 
'siblings': '">qqqq'} 

編輯

好了,試試這個:

def iterator(payload): 
    for i in payload: 
     if isinstance(payload[i],dict): 
      iterator(payload[i]) 
     else: 
      temp = payload[i] 
      payload[i] = '">qqqq' 
      send_POST(self.payload) 
      payload[i] = temp 

在哪裏send_POST是一個包裝你的POST調用的函數。

+0

據我瞭解,這是所需的。通過添加一個條件來防止分配字符串,修改它會很簡單。 –

+0

*我想替換每個鍵值對的值(除非值本身是字典,例如:「role」)。* –

+0

我明白了。好吧,我認爲這個規範有矛盾和矛盾,所以也許Virtue Crazy可以最終確切地說明所要求的內容。 –