python - 从不完整的 HTTP JSON 响应中完成 json 字符串

标签 python json python-3.x api http

有时我会从json api下载数据,它会中途中断,通常是由于网络超时或其他一些问题。但是,在这种情况下,我希望能够读取可用的数据。这是一个例子:

{
    "response": 200,
    "message": None,
    "params": []
    "body": {
        "timestamp": 1546033192,
        "_d": [
                {"id": "FMfcgxwBTsWRDsWDqgqRtZlLMdpCpTDz"},
                {"id": "FMfcgxwBTkFSKqRrcKzMFvLCjDSSbrJH"},
                {"id": "Fmfgo9

我希望能够“完成字符串”,以便能够将不完整的响应解析为 json。例如:

s = '''
{
    "response": 200,
    "message": null,
    "params": [],
    "body": {
        "timestamp": 1546033192,
        "_d": [
                {"id": "FMfcgxwBTsWRDsWDqgqRtZlLMdpCpTDz"},
                {"id": "FMfcgxwBTkFSKqRrcKzMFvLCjDSSbrJH"}
              ]
    }
}'''
json.loads(s)
{'response': 200, 'message': None, 'params': [], 'body': {'timestamp': 1546033192, '_d': [{'id': 'FMfcgxwBTsWRDsWDqgqRtZlLMdpCpTDz'}, {'id': 'FMfcgxwBTkFSKqRrcKzMFvLCjDSSbrJH'}]}}

如何使用任意构造的 json 对象(例如上面的内容)来执行上述操作?

最佳答案

为此任务编写解析器的想法在智力上确实很有趣,但我强烈警告您不要遵循这种方法。

根本问题是,当网络请求失败时,您将进入未定义行为的领域。您绝对无法保证最终的输出是什么,因此您可能不应该尝试欺骗。

两种可能性是您的输入不完整但部分可理解,或者完全不可理解。增加的复杂性加上失败的网络请求的未定义性质意味着您可能无论如何都不应该尝试定义它。

TCP/IP protocol 为例处理类似的问题。通过网络,经常会出现packet loss ,意味着部分数据无法完全传输。引用维基百科的话,TCP“检测数据包丢失并执行重传以确保可靠的消息传递”。

我强烈建议采用类似的方法。要么重新获取数据,要么简单地将错误视为福音并对错误状态执行某些操作。

关于python - 从不完整的 HTTP JSON 响应中完成 json 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964597/

相关文章:

python-3.x - aws emr 无法在 Bootstrap 上更改默认的 pyspark python

带有自定义共享库的 Python C 扩展链接

python - 是否可以在阻塞并可能回调 Python 的 C 函数之前释放 GIL?

Python MySQL 批量插入字符编码错误

ios - viewDidLoad多线程问题

javascript - 如何从 json-server 托管的 API 访问数组中的对象

python - celery :一次分派(dispatch)很多工作

javascript - 如何从键/值 JSON 对象中提取键?

python - 在协程中产生

Python导出多个数据到一个json文件