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