
本教程旨在解决api响应中包含多个json对象但缺乏标准数组封装和逗号分隔的非规范情况。我们将深入探讨一种基于行内容特征识别json对象边界的python解析策略,通过示例代码演示如何将这些独立且无分隔符的json字符串准确地分割并解析为独立的python字典列表,确保数据能够被正确处理和利用。
在与各种API交互时,我们通常期望接收到符合RFC 8259标准的JSON响应。然而,在某些特殊场景下,API可能返回一种非标准的JSON结构,其中包含多个独立的JSON对象,但这些对象既没有被包裹在一个外层数组 [] 中,也没有通过逗号 , 进行分隔。它们可能只是简单地一个接一个地拼接在一起,如下所示:
{
"key1": "value1",
"key2": "value2"
}
{
"key3": "value3",
"key4": "value4"
}直接使用 json.loads() 解析此类字符串会导致 json.JSONDecodeError,因为整个字符串不构成一个有效的JSON文档(既不是单个对象也不是单个数组)。本教程将介绍一种在Python中有效解析此类非标准响应的策略。
上述非标准结构的核心挑战在于缺乏明确的分隔符。每个JSON对象都以 { 开始,以 } 结束。当一个JSON对象结束后,下一个JSON对象可能紧随其后开始。这种模式提供了一个关键线索:一个对象的结束符 } 后面紧跟着下一个对象的开始符 {,通常在不同的行上。我们可以利用这一特征来识
别对象之间的边界。
我们的策略是逐行读取原始响应数据,并寻找表示一个JSON对象结束和另一个JSON对象开始的特定行模式。具体来说,当遇到一行内容仅为 } 且紧接着下一行内容仅为 { 时,这便是一个对象边界的信号。通过这种方式,我们可以将原始的非标准字符串分割成多个独立的、有效的JSON字符串片段,然后对每个片段单独进行解析。
BlessAI
Bless AI 提供五个独特的功能:每日问候、庆祝问候、祝福、祷告和名言的文本生成和图片生成。
135
查看详情
以下Python代码演示了如何应用上述策略来解析此类非标准的多对象JSON响应。
import json
# 示例非标准JSON响应数据
non_standard_json_data = '''
{
"self": "https://example1.com",
"key": "keyOne",
"name": "nameOne",
"emailAddress": "mailOne",
"*atarUrls": {
"48x48": "https://test.com/secure/user*atar?*atarId=1",
"24x24": "https://test.com/secure/user*atar?size=small&*atarId=1",
"16x16": "https://test.com/secure/user*atar?size=xsmall&*atarId=1",
"32x32": "https://test.com/secure/user*atar?size=medium&*atarId=1"
},
"displayName": "displayNameOne",
"active": true,
"timeZone": "Europe",
"locale": "en_UK"
}
{
"self": "https://example2.com",
"key": "keyTwo",
"name": "nameTwo",
"emailAddress": "mailTwo",
"*atarUrls": {
"48x48": "https://test.com/secure/user*atar?*atarId=2",
"24x24": "https://test.com/secure/user*atar?size=small&*atarId=2",
"16x16": "https://test.com/secure/user*atar?size=xsmall&*atarId=2",
"32x32": "https://test.com/secure/user*atar?size=medium&*atarId=2"
},
"displayName": "displayNameTwo",
"active": false,
"timeZone": "Europe",
"locale": "en_US"
}
'''
def parse_non_standard_multi_json(raw_data: str) -> list[dict]:
"""
解析包含多个非标准连接JSON对象的字符串。
Args:
raw_data: 包含多个JSON对象的原始字符串。
Returns:
一个包含所有解析出的JSON字典的列表。
"""
parsed_objects = []
# 将原始数据按行分割,并移除每行首尾的空白字符
lines = [line.strip() for line in raw_data.splitlines()]
# 过滤掉空行,确保只处理有效内容行
lines = [line for line in lines if line]
current_object_start_index = 0
for i, line in enumerate(lines):
# 寻找对象边界:当前行是'{'且前一行是'}'
if i > 0 and line == "{" and lines[i-1] == "}":
# 提取前一个完整的JSON对象的所有行
json_segment_lines = lines[current_object_start_index:i]
# 将这些行拼接成一个完整的JSON字符串
json_string = "".join(json_segment_lines)
try:
# 解析并添加到结果列表
parsed_objects.append(json.loads(json_string))
except json.JSONDecodeError as e:
print(f"解析JSON片段失败: {e}\n片段内容: {json_string}")
# 根据实际需求处理错误,例如跳过或记录
# 更新下一个对象的起始索引
current_object_start_index = i
# 处理最后一个JSON对象
if current_object_start_index < len(lines):
json_segment_lines = lines[current_object_start_index:]
json_string = "".join(json_segment_lines)
try:
parsed_objects.append(json.loads(json_string))
except json.JSONDecodeError as e:
print(f"解析最后一个JSON片段失败: {e}\n片段内容: {json_string}")
return parsed_objects
# 调用解析函数
result_list = parse_non_standard_multi_json(non_standard_json_data)
# 打印解析结果以验证
print(f"成功解析 {len(result_list)} 个JSON对象:")
for idx, obj in enumerate(result_list):
print(f"\n--- 对象 {idx + 1} ---")
print(json.dumps(obj, indent=2, ensure_ascii=False))
尽管API返回非标准JSON格式是一种不理想的情况,但通过本教程介绍的基于行内容特征识别边界的策略,我们能够有效地在Python中解析此类数据。该方法的核心在于将原始数据分割成多个独立的、可解析的JSON字符串片段,然后逐一处理。理解这种策略及其潜在的局限性,将有助于开发者在面对各种复杂数据格式时,构建更健壮和灵活的数据处理方案。
以上就是处理非标准多对象JSON响应:Python解析策略与实践的详细内容,更多请关注其它相关文章!
# js
# 仅为
# 数据结构
# 原始数据
# 如何实现
# 此类
# 多个
# json数组
# ai
# app
# 正则表达式
# json
# python
# 非标准
# 日照附近网络营销推广
# 常州网站建设对比
# 玉溪网站优化网络推广
# 浙江关键词排名优化策略
# 深圳刷关键词排名
# 优化网站建设推广
# 商城网站建设教训
# 移除
# 跳过
# 淘宝网站建设最专业
# 汕头产品seo优化公司
# 招seo出差
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法
C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用
J*a实现任务清单管理_集合框架综合入门练手
c++如何掌握指针的核心用法_c++指针入门到精通指南
iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南
Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频
铁路12306官网登录入口 铁路12306在线购票官方平台
京东物流快递破损了怎么办_京东快递破损理赔流程
《合金装备4》有望推出重制版!制作人发话了
键盘声音异常怎么回事_键盘异响怎么处理
苹果手机聊天记录删除了如何恢复
TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法
实时数据流中高效查找最小值与最大值
AO3永久镜像入口开放_AO3最新网址兼容所有浏览器
KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法
b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法
mail.qq.com登录入口 QQ邮箱网页版直达
邦丰播放器频道搜索设置
J*aScript与HTML元素交互:图片点击事件与链接处理教程
Python测试中模块导入路径解析的最佳实践
漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐
Golang如何初始化module项目_Golang module init使用说明
PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素
微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程
Go Goroutine调度与并发执行深度解析
《幻兽帕鲁》手游帕鲁捕捉技巧分享
qq音乐官方网站入口_qq音乐在线听歌网页版链接
yandex网页版直接登录 yandex官方入口平台访问方法
搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能
WooCommerce购物车:强制显示所有交叉销售商品教程
在Flask应用中安全高效地更新SQLAlchemy用户数据
如何用mysql开发用户注册登录功能_mysql用户注册登录数据库设计
windows10怎么更改下载路径_windows10默认存储位置修改教程
edge浏览器怎么修改语言为中文_Edge界面语言切换教程
优化 React onClick 事件处理:函数引用与箭头函数的对比
三星M34录音变声问题_Samsung M34麦克风调整
魔法祈幻界兑换码礼包大全
网易云音乐闹钟铃声设置教程
植物大战僵尸95版游戏版下载_植物大战僵尸95版游戏版安装指南
阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口
iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法
Python高效统计字典嵌套列表值在目标列表中的出现次数
大众点评了却看不到是怎么回事
嘀嗒顺风车如何开具电子发票
51漫画网实时入口 51漫画网页版官方免费漫画入口
发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?
在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角
百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置
2025-12-14
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。