2016-01-20 124 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