Python无效json [已关闭]

hivapdat  于 2023-01-22  发布在  Python
关注(0)|答案(1)|浏览(161)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
我通过我的API接收到以下json:

{"info":"{\"allEvents\":\"[{\\\"equipDetailChargeAmount\\\":\\\"\\\",\\\"equipDetailDescription\\\":\\\"ONT XS-010X-Q Indoor\\\",\\\"equipDetailQty\\\":\\\"1\\\",\\\"equipDetailSerialNbr\\\":\\\"ALCLFC76C655\\\"}]\",\"interventionFinishTime\":\"2023-01-18 08:33:47\",\"technicanNumber\":\"xyz\",\"orderNumber\":\"NM550044-4\",\"accessNumber\":\"131001199099\",\"interventionArrivalTime\":\"2023-01-18 08:00:00\",\"installationAddress\":\"001, Doheem\",\"allFlags\":\"[{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"Inst./supp. Patch NTP\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"},{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"mise en service produit NTP\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"},{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"\\\\\\\"Attente non payante \\\\\\\\\\\\\\\"\\\\\\\"Divers\\\\\\\\\\\\\\\"\\\\\\\"\\\\\\\"\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"}]\",\"operator\":\"BLABLA SA\"}"}

在所有的在线json验证器中,这个json看起来是有效的,但是在python中失败了,并显示消息:需要','分隔符:第1行第675列(字符674)。我用下面的字符替换反斜杠,返回一个dict:

self._json_data = self._json_data.replace('\\', '').replace('\"[{', '[{').replace('}]\"', '}]').replace('\"{\"', '{\"').replace('}\"', '}')
json_dict = json.loads(self._json_data)

也许这是一个错误的方法,但我该如何解决这个问题呢?

omhiaaxx

omhiaaxx1#

正如评论所建议的那样,这一问题应在源头加以解决。
然而,要按原样解析响应,您需要解码多个级别。
首先,你给出的例子不是json,而是一个包含json的python dict,要解析这个json,你需要通过键来访问它。

import json
response = {"info":"{\"allEvents\":\"[{\\\"equipDetailChargeAmount\\\":\\\"\\\",\\\"equipDetailDescription\\\":\\\"ONT XS-010X-Q Indoor\\\",\\\"equipDetailQty\\\":\\\"1\\\",\\\"equipDetailSerialNbr\\\":\\\"ALCLFC76C655\\\"}]\",\"interventionFinishTime\":\"2023-01-18 08:33:47\",\"technicanNumber\":\"xyz\",\"orderNumber\":\"NM550044-4\",\"accessNumber\":\"131001199099\",\"interventionArrivalTime\":\"2023-01-18 08:00:00\",\"installationAddress\":\"001, Doheem\",\"allFlags\":\"[{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"Inst./supp. Patch NTP\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"},{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"mise en service produit NTP\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"},{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"\\\\\\\"Attente non payante \\\\\\\\\\\\\\\"\\\\\\\"Divers\\\\\\\\\\\\\\\"\\\\\\\"\\\\\\\"\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"}]\",\"operator\":\"BLABLA SA\"}"}
parsed = json.loads(response["info"])

在这里,parsed仍然没有被完全解析,因为它是一个python dict,它的值 * 有时 * 包含json。如果你事先知道它们并且它们总是相同的,你可以简单地直接通过键解析它们。* 或者 * 你可以简单地检查值是否包含"["
所以第二部分应该是:

final_result = {k: json.loads(v) if '[' in v else v for k, v in parsed.items()}

完整代码:

import json
response = {"info":"{\"allEvents\":\"[{\\\"equipDetailChargeAmount\\\":\\\"\\\",\\\"equipDetailDescription\\\":\\\"ONT XS-010X-Q Indoor\\\",\\\"equipDetailQty\\\":\\\"1\\\",\\\"equipDetailSerialNbr\\\":\\\"ALCLFC76C655\\\"}]\",\"interventionFinishTime\":\"2023-01-18 08:33:47\",\"technicanNumber\":\"xyz\",\"orderNumber\":\"NM550044-4\",\"accessNumber\":\"131001199099\",\"interventionArrivalTime\":\"2023-01-18 08:00:00\",\"installationAddress\":\"001, Doheem\",\"allFlags\":\"[{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"Inst./supp. Patch NTP\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"},{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"mise en service produit NTP\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"},{\\\"pkgDetailQty\\\":\\\"1\\\",\\\"pkgDetailDescription\\\":\\\"\\\\\\\"Attente non payante \\\\\\\\\\\\\\\"\\\\\\\"Divers\\\\\\\\\\\\\\\"\\\\\\\"\\\\\\\"\\\",\\\"pkgDetailChargeAmount\\\":\\\"\\\"}]\",\"operator\":\"BLABLA SA\"}"}
parsed = json.loads(response["info"])
final_result = {k: json.loads(v) if '[' in v else v for k, v in parsed.items()}
print(final_result)

相关问题