如何在Python中将多JSON拼接字符串分割为对象列表?
解决方案:分割拼接的JSON对象列表
方法一:包装为合法JSON数组后解析(推荐)
原始字符串是多个独立JSON对象用逗号直接拼接,最稳妥的方式是给它加上数组的首尾括号,转成合法的JSON数组,再用标准JSON解析器处理,彻底规避嵌套结构的解析风险。
示例代码(Python):
import json # 你的原始拼接JSON字符串 raw_json_str = '{"creationtime":"2022-11-25T09:12:44Z","data":[{"id":"78cb7b69-bbfa-4d6c-8156-ada66201bf73","id_v1":"/sensors/22","motion":{"motion":true,"motion_valid":true},"owner":{"rid":"4b16b918-485a-44de-82aa-4ff467f6591a","rtype":"device"},"type":"motion"}],"id":"813e2ed1-f28e-451b-9ac6-9eef76ef7b4a","type":"update"},{"creationtime":"2022-11-25T09:12:44Z","data":[{"id":"6a743cb9-bcc4-44bb-8592-c4854e8fadcb","id_v1":"/sensors/32","motion":{"motion":true,"motion_valid":true},"owner":{"rid":"cdb31512-997f-4e26-80d1-50dca6b431a3","rtype":"device"},"type":"motion"}],"id":"240698ea-5938-4e7c-a70c-75bad0fe2a7f","type":"update"},{"creationtime":"2022-11-25T09:12:44Z","data":[{"id":"f4fc5daf-a2aa-4c9f-9812-a65c9922b53e","id_v1":"/sensors/2","motion":{"motion":true,"motion_valid":true},"owner":{"rid":"8daa62b1-af26-44b3-8356-15d21cf6642c","rtype":"device"},"type":"motion"}],"id":"124546d2-cf7e-4b64-a99d-2af2c047aaea","type":"update"}' # 包装成合法JSON数组 valid_array_str = f"[{raw_json_str}]" # 解析为JSON对象列表 json_objects = json.loads(valid_array_str) # 遍历输出每个完整JSON对象 for obj in json_objects: print(json.dumps(obj, indent=2))
这种方法依赖标准JSON解析器的嵌套结构处理能力,是生产环境的首选方案,几乎没有边界 case 问题。
方法二:使用正则表达式(仅适用于结构固定场景)
如果必须用正则处理,可以用递归匹配来跟踪括号层级,匹配完整的JSON对象。但注意:该方法仅适用于JSON字符串中没有转义{/}的场景,否则会失效。
正则表达式:\{(?:[^{}]|(?R))*\}
示例代码(Python):
import re raw_json_str = '{"creationtime":"2022-11-25T09:12:44Z","data":[{"id":"78cb7b69-bbfa-4d6c-8156-ada66201bf73","id_v1":"/sensors/22","motion":{"motion":true,"motion_valid":true},"owner":{"rid":"4b16b918-485a-44de-82aa-4ff467f6591a","rtype":"device"},"type":"motion"}],"id":"813e2ed1-f28e-451b-9ac6-9eef76ef7b4a","type":"update"},{"creationtime":"2022-11-25T09:12:44Z","data":[{"id":"6a743cb9-bcc4-44bb-8592-c4854e8fadcb","id_v1":"/sensors/32","motion":{"motion":true,"motion_valid":true},"owner":{"rid":"cdb31512-997f-4e26-80d1-50dca6b431a3","rtype":"device"},"type":"motion"}],"id":"240698ea-5938-4e7c-a70c-75bad0fe2a7f","type":"update"},{"creationtime":"2022-11-25T09:12:44Z","data":[{"id":"f4fc5daf-a2aa-4c9f-9812-a65c9922b53e","id_v1":"/sensors/2","motion":{"motion":true,"motion_valid":true},"owner":{"rid":"8daa62b1-af26-44b3-8356-15d21cf6642c","rtype":"device"},"type":"motion"}],"id":"124546d2-cf7e-4b64-a99d-2af2c047aaea","type":"update"}' # 编译正则,递归匹配完整JSON对象 pattern = re.compile(r'\{(?:[^{}]|(?R))*\}') # 提取所有匹配结果 json_object_list = pattern.findall(raw_json_str) # 输出每个对象 for item in json_object_list: print(item + ",")
内容的提问来源于stack exchange,提问作者Szjoin
相关产品推荐
相关产品推荐

