如何在Java中通过URL解析文件中的多个JSON对象
嘿,我来帮你搞定这个问题!处理包含多个JSON对象的文本文件并把数据存入数据库其实没那么复杂,我给你梳理个清晰的实操流程,用Python来举例,你可以直接参考着来:
步骤1:读取并解析JSON数据
首先得明确你的文本文件里JSON的存储格式——是每行一个独立JSON对象,还是多个JSON对象无分隔/用逗号分隔但没数组包裹?我给你两种场景的处理方式:
场景A:每行一个JSON对象
这种格式很常见(比如日志类文件),我们可以逐行读取解析:
import json json_data_list = [] # 替换成你的文件路径 with open('your_json_file.txt', 'r', encoding='utf-8') as f: for line in f: # 跳过空行避免解析报错 if line.strip(): try: json_obj = json.loads(line) json_data_list.append(json_obj) except json.JSONDecodeError as e: print(f"解析该行出错: {e},内容为: {line}")
场景B:多个JSON对象无分隔/逗号分隔无数组包裹
如果文件是{"a":1}{"b":2}或者{"a":1},{"b":2}这种格式,推荐用ijson做流式解析,避免大文件占用过多内存:
import ijson json_data_list = [] with open('your_json_file.txt', 'r', encoding='utf-8') as f: # 流式读取每个独立的JSON对象 for obj in ijson.items(f, ''): json_data_list.append(obj)
注:如果没装ijson,先运行pip install ijson安装依赖
步骤2:提取目标字段
现在所有JSON对象都转成Python字典了,你可以按需提取字段,比如从你提供的示例里取出address、city、country等信息:
extracted_data = [] for obj in json_data_list: # 用get方法避免字段不存在时抛出KeyError item = { 'address': obj.get('address'), 'city': obj.get('city'), 'country': obj.get('country'), # 转成数值类型,方便后续数据库的数值查询 'latitude': float(obj.get('latitude', 0.0)), 'longitude': float(obj.get('longitude', 0.0)), 'name': obj.get('name'), 'date_added': obj.get('dateAdded') } extracted_data.append(item)
步骤3:存入数据库
这里用SQLite举例(无需额外安装数据库服务,适合快速测试),如果用MySQL、PostgreSQL,只需要替换对应的连接库和SQL语句即可:
import sqlite3 # 连接数据库(不存在则自动创建) conn = sqlite3.connect('businesses.db') cursor = conn.cursor() # 创建存储表(如果不存在) cursor.execute(''' CREATE TABLE IF NOT EXISTS businesses ( id INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT, city TEXT, country TEXT, latitude REAL, longitude REAL, name TEXT, date_added TEXT ) ''') # 批量插入数据,比循环单条插入效率高很多 cursor.executemany(''' INSERT INTO businesses (address, city, country, latitude, longitude, name, date_added) VALUES (:address, :city, :country, :latitude, :longitude, :name, :date_added) ''', extracted_data) # 提交更改并关闭连接 conn.commit() conn.close()
一些实用提示
- 数据类型校验:比如经纬度转成数值类型,避免存成字符串影响后续的范围查询等操作
- 异常捕获:在解析JSON和插入数据库时都要加异常处理,防止一条坏数据导致整个程序崩溃
- 大文件优化:如果文件特别大,不要一次性加载所有数据到内存,用流式解析或者分块处理的方式
- 字段容错:用
get方法提取字段时可以设置默认值,避免因缺失字段报错
内容的提问来源于stack exchange,提问作者Geo Thomas
相关产品推荐
相关产品推荐

