通过不完整的HTTP JSON响应完成JSON字符串

时间:2018-12-28 21:46:14

标签: 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对象来完成上述操作?

2 个答案:

答案 0 :(得分:0)

这是我这样做的方式,建立了GETdiv个字符的堆栈以尝试“完成”。它有点冗长,可以清除,但可以在我尝试过的一些字符串输入中使用:

innerHtml

代码如下:

}

答案 1 :(得分:0)

为此任务编写一个解析器的想法在理论上确实很有趣,但是我强烈警告您不要采用这种方法。

基本问题是,当网络请求失败时,您正在进入未定义行为的领域。您绝对不能保证所得到的输出将是什么,因此您可能不应该尝试输出一个。

这两种可能性是您的输入不完整但部分可以理解,或者完全无法理解。额外的复杂性加上失败的网络请求的不确定性质,意味着您可能无论如何都不应该尝试对其进行定义。

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

我强烈建议采用类似的方法。重新获取数据,或者简单地将错误当做福音,并对错误状态进行处理。