Python - 替换JSON中未知键的值

4

我对Python还很陌生,所以我的问题是:

我正在进行HTTP调用来获取使用Javascript创建的一些JSON数据。这个JSON可能有一些值,如"nan""inf""-inf"作为字符串。这些值的键和深度是未知的。我想在Python中找到这些值并将它们替换为float("nan")float("inf")的Python等效项。

由于据说无法更改Javascript方面的任何内容,因此不能在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参数,但我不确定如何使用它。
附注:我仍在使用Python 2。
谢谢。
1个回答

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))

不得不将 isinstance(dirty_data, str) 更改为 isinstance(dirty_data, basestring) 才能使其正常工作。你知道为什么吗? - XeniaSis
当我使用 type("test")type(json.loads('{"a": "123"}')["a"]) 检查类型时,它们都显示为 str,所以我不知道为什么你的结果会不同。 - Leo
在Python 2中,json.loads返回的是unicode而不是str。如果你仍在使用Python 2,这可能是原因。 - Leo
是的,这就是原因!我忘了提到它。我会编辑我的问题以包含它,也许你可以编辑你的问题,这样它就完整了。 - XeniaSis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接