2016-01-20 128 views
4

我對Python很新,所以這裏是我的問題。python - 替換json中未知鍵的值

我正在做一個HTTP調用來獲取一些用Javascript創建的JSON數據。此JSON可能具有一些值,如"nan","inf""-inf"作爲字符串。這些值的鍵和深度是未知的。我想在Python方面做的是找到這些值,並用Python的等價物float("nan")float("inf")替換它們。就像我被告知的那樣,改變Javascript端的任何東西都是不可能的。

我用下面的函數讀取HTTP響應並返回JSON相當於

def http_response_to_json(response): 
    response_str = "" 
    CHUNK = 16 * 1024 

    while True: 
     try: 
      chunk = response.read(CHUNK) 
      if not chunk: 
       break 
      response_str += chunk 
     except httplib.IncompleteRead, e: 
      response_str += e.partial 

    return json.loads(response_str) 

我對json.loadsobject_hook參數讀取了,但我不知道是否和如何使用它。

P.S.我使用Python 2仍然

感謝

回答

1

加載與JSON.loads數據後,您可以使用遞歸函數來清理數據。這裏有一個如何做到這一點的例子。

def cleanup(dirty_data): 
    if isinstance(dirty_data, dict): 
     for key in dirty_data: 
      value = dirty_data[key] 
      dirty_data[key] = cleanup(value) 
     return dirty_data 
    elif isinstance(dirty_data, str): 
     if dirty_data in ["nan", "inf", "-inf"]: 
      return float(dirty_data) 
    else: 
     return dirty_data 

test_object = {"test": 123, "a": {"b": "nan"}} 

print(cleanup(test_object)) 

這將輸出:{'a': {'b': nan}, 'test': 123}


編輯:下面是使用Python 2兼容版本

def cleanup(dirty_data): 
    if isinstance(dirty_data, dict): 
     for key in dirty_data: 
      value = dirty_data[key] 
      dirty_data[key] = cleanup(value) 
     return dirty_data 
    elif isinstance(dirty_data, str) or isinstance(dirty_data, unicode): 
     if dirty_data in ["nan", "inf", "-inf"]: 
      return float(dirty_data) 
    else: 
     return dirty_data 

test_object = {"test": 123, "a": {"b": "nan"}} 

print(cleanup(test_object)) 
+0

不得不改變'isinstance(dirty_data,STR)'來'isinstance(dirty_data,basestring)'讓它工作。任何想法爲什麼? – XeniaSis

+0

當我檢查type(「test」)和type(json.loads('{「a」:「123」}')[「a」])'時,他們說這是'str'所以我不知道你爲什麼會這樣。無論如何, – GKBRK

+0

!謝謝!答案接受:) – XeniaSis