python – 替换json中未知键的值

我是 Python的新手,所以这是我的问题.

我正在进行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.loads的object_hook参数,但我不确定是否以及如何使用它.

附:我还在使用Python 2

谢谢

最佳答案 使用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))
点赞