我对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
由于
答案 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))