python - 替换json中未知键的值

时间:2016-01-20 08:27:01

标签: python json

我对Python很陌生,所以这是我的问题。

我正在进行HTTP调用以获取使用Javascript创建的一些JSON数据。此JSON可能包含"nan""inf""-inf"等值作为字符串。这些值的键和深度是未知的。我想在Python方面做的是找到这些值并用等效于float("nan")float("inf")的Python替换它们。

正如我被告知的那样,改变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)

我已阅读object_hook的{​​{1}}参数,但我不确定是否以及如何使用它。

P.S。我还在使用Python 2

由于

1 个答案:

答案 0 :(得分: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))