如何拆分Python 3.6.3中REST API返回的长JSON数据行?
拆分MDM API返回的长行JSON响应
看起来你从MDM的REST API拿到了一堆紧凑的位置数据,想要把它拆分成易读的格式或者提取单个条目?在Python 3.6.3里处理这个很简单,我给你两种常用的方法:
1. 格式化输出成易读的JSON结构
如果只是想把长行数据拆分成换行缩进的格式,用Python内置的json模块就能搞定。不管你拿到的是原始JSON字符串还是已经解析好的Python列表/字典,都能处理:
情况A:已经是Python对象(比如用requests.get().json()获取的)
import json # 假设这是你从API拿到的完整数据(补全了你截断的部分) location_data = [ {'SampleTime': '4/17/2018 6:39:00 PM', 'Latitude': '32.18007400', 'Longitude': '-94.35314700', 'Elevation': '72.76', 'Speed': '16.43', 'DeviceId': {'Value': 74365}, 'Id': {'Value': 126709703}}, {'SampleTime': '4/17/2018 6:24:00 PM', 'Latitude': '32.18735200', 'Longitude': '-94.36022700', 'Elevation': '64.67', 'Speed': '5.59', 'DeviceId': {'Value': 74365}, 'Id': {'Value': 126709702}} ] # 格式化输出,indent=4表示用4个空格缩进,sort_keys=False保持原字段顺序 formatted_output = json.dumps(location_data, indent=4, sort_keys=False) print(formatted_output)
运行后你会得到:
[ { "SampleTime": "4/17/2018 6:39:00 PM", "Latitude": "32.18007400", "Longitude": "-94.35314700", "Elevation": "72.76", "Speed": "16.43", "DeviceId": { "Value": 74365 }, "Id": { "Value": 126709703 } }, { "SampleTime": "4/17/2018 6:24:00 PM", "Latitude": "32.18735200", "Longitude": "-94.36022700", "Elevation": "64.67", "Speed": "5.59", "DeviceId": { "Value": 74365 }, "Id": { "Value": 126709702 } } ]
情况B:拿到的是原始JSON字符串
如果API返回的是未解析的长字符串,先解析成Python对象再格式化:
import json # 原始长行JSON字符串(注意补全截断的部分) raw_json = '''[{"SampleTime": "4/17/2018 6:39:00 PM", "Latitude": "32.18007400", "Longitude": "-94.35314700", "Elevation": "72.76", "Speed": "16.43", "DeviceId": {"Value": 74365}, "Id": {"Value": 126709703}}, {"SampleTime": "4/17/2018 6:24:00 PM", "Latitude": "32.18735200", "Longitude": "-94.36022700", "Elevation": "64.67", "Speed": "5.59", "DeviceId": {"Value": 74365}, "Id": {"Value": 126709702}}]''' # 解析成Python列表 location_data = json.loads(raw_json) # 之后就可以用上面的格式化方法了 formatted_output = json.dumps(location_data, indent=4, sort_keys=False) print(formatted_output)
2. 遍历拆分每个数据条目
如果需要单独处理每个位置样本(比如提取设备ID、经纬度等),直接遍历列表里的每个字典就行:
# 还是用上面的location_data for idx, entry in enumerate(location_data, 1): print(f"=== 第{idx}条位置数据 ===") print(f"采样时间: {entry['SampleTime']}") print(f"经纬度: {entry['Latitude']}, {entry['Longitude']}") print(f"海拔: {entry['Elevation']} 米") print(f"速度: {entry['Speed']} 单位") print(f"设备ID: {entry['DeviceId']['Value']}") print(f"记录ID: {entry['Id']['Value']}\n")
运行后输出:
=== 第1条位置数据 === 采样时间: 4/17/2018 6:39:00 PM 经纬度: 32.18007400, -94.35314700 海拔: 72.76 米 速度: 16.43 单位 设备ID: 74365 记录ID: 126709703 === 第2条位置数据 === 采样时间: 4/17/2018 6:24:00 PM 经纬度: 32.18735200, -94.36022700 海拔: 64.67 米 速度: 5.59 单位 设备ID: 74365 记录ID: 126709702
这些方法在Python 3.6.3里都能完美运行,因为json模块是内置的,不需要额外安装依赖。如果你的原始数据有截断,记得先补全成合法的JSON格式哦。
内容的提问来源于stack exchange,提问作者Brett Wilson
相关产品推荐
相关产品推荐

