当前位置: 首页 > news >正文

【langchain学习】从零开始掌握 JSONLoader:轻松解析复杂 JSON 数据

在使用 JSONLoader 之前,我们需要确保安装了 jq 库:

pip install -U jq

如果不能安装的话,可以用:(如果你是win系统,则不能直接使用jq)

conda install jq 

接下来,我们通过一个关于 Jonas Vingegaard 的 JSON 数据示例来演示 JSONLoader 的基本功能。

JSON 示例数据
{"tour_de_france": {"year": 2023,"winner": "Jonas Vingegaard","team": "Team Jumbo-Visma","stages": [{"stage": 1,"date": "2023-07-01","distance_km": 182,"result": {"position": 2,"time": "4h 12m 34s"}},{"stage": 2,"date": "2023-07-02","distance_km": 209,"result": {"position": 1,"time": "5h 01m 45s"}},{"stage": 3","date": "2023-07-03","distance_km": 176,"result": {"position": 3,"time": "3h 58m 21s"}}],"total_time": "13h 12m 40s","average_speed_kmh": 41.3}
}
1.1 提取所有赛段结果

我们首先通过 JSONLoader 提取 Jonas Vingegaard 在所有赛段中的比赛结果:

from langchain_community.document_loaders import JSONLoaderfile_path = './vingegaard_tdf_2023.json'
loader = JSONLoader(file_path=file_path,jq_schema='.tour_de_france.stages[].result',text_content=False
)docs = loader.load()
for doc in docs:print(doc.page_content)

输出:

{"position": 2, "time": "4h 12m 34s"}
{"position": 1, "time": "5h 01m 45s"}
{"position": 3, "time": "3h 58m 21s"}

在这个例子中,我们使用 jq_schema 提取了 tour_de_france.stages[].result,即每个赛段的结果信息。

1.2 提取比赛的总时间和平均速度

如果我们只关心比赛的总时间和平均速度,可以通过以下 jq_schema 进行提取:

loader = JSONLoader(file_path=file_path,jq_schema='.tour_de_france | {total_time, average_speed_kmh}',text_content=False
)docs = loader.load()
print(docs[0].page_content)

输出:

{"total_time": "13h 12m 40s","average_speed_kmh": 41.3
}

这里我们提取了 total_timeaverage_speed_kmh,这些数据可以帮助我们快速了解 Jonas Vingegaard 在整个比赛中的表现。

1.3 提取特定赛段的信息

假设我们想要提取第 2 赛段的详细信息:

loader = JSONLoader(file_path=file_path,jq_schema='.tour_de_france.stages[] | select(.stage == 2)',text_content=False
)docs = loader.load()
print(docs[0].page_content)

输出:

{"stage": 2,"date": "2023-07-02","distance_km": 209,"result": {"position": 1,"time": "5h 01m 45s"}
}

通过这个查询,我们精确地定位到了第 2 赛段的详细信息,包括日期、距离和比赛结果。


2. 深入探讨:自定义元数据处理

JSONLoader 不仅可以提取数据,还允许我们自定义元数据。这对于需要对数据进行进一步处理和分析的场景非常有用。

2.1 自定义元数据示例

我们可以定义一个 metadata_func 来生成自定义元数据,比如增加一个“赛段总数”作为元数据:

def custom_metadata(json_obj, metadata):metadata['total_stages'] = len(json_obj['tour_de_france']['stages'])return metadataloader = JSONLoader(file_path=file_path,jq_schema='.tour_de_france.stages[].result',metadata_func=custom_metadata,text_content=False
)docs = loader.load()
for doc in docs:print(doc.metadata)

输出:

{'source': './vingegaard_tdf_2023.json', 'seq_num': 1, 'total_stages': 3}
{'source': './vingegaard_tdf_2023.json', 'seq_num': 2, 'total_stages': 3}
{'source': './vingegaard_tdf_2023.json', 'seq_num': 3, 'total_stages': 3}

通过这个例子,我们可以看到如何利用 metadata_func 为每个文档对象添加自定义的元数据,这在大型数据集处理时非常有帮助。


3. 扩展功能:异步和惰性加载

在处理大规模 JSON 文件时,JSONLoader 提供了异步加载和惰性加载的选项,以优化内存使用和处理性能。

3.1 异步加载

使用异步加载可以在需要并发处理时提高性能:

docs = await loader.aload()
print(docs[0].page_content)
3.2 惰性加载

惰性加载允许我们按需加载数据,而不是一次性加载所有内容:

docs_lazy = loader.lazy_load()
docs = []
for doc in docs_lazy:docs.append(doc)
print(docs[0].page_content)

这些扩展功能使得 JSONLoader 能够灵活应对不同规模和复杂度的 JSON 数据处理需求。


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数据结构】五、树:7.哈夫曼树、哈夫曼编码
  • 物联网井盖-智能井盖-旭华智能
  • 【python】在Python中操作MongoDB的详细用法教程与实战案例分享
  • 北斗三号5G遥测终端机系统在水库大坝安全监测应用
  • 在 MySQL 中查找最小的缺失 ID
  • webrtc一对一视频通话功能实现
  • centos7 服务器搭建
  • 深度学习------------池化层
  • vue3 ts vite开发bug记录(类型转换)
  • 如何获取能直接在浏览器打开的播放地址?
  • C语言 --- 枚举、位运算
  • 电机学习-基础知识
  • AR技术:汽车行业创新发展的新动力
  • Grafana 可视化监控和告警
  • 28. 找出字符串中第一个匹配项的下标【 力扣(LeetCode) 】
  • [译] React v16.8: 含有Hooks的版本
  • 【EOS】Cleos基础
  • 2017 年终总结 —— 在路上
  • 2019年如何成为全栈工程师?
  • 30天自制操作系统-2
  • Cumulo 的 ClojureScript 模块已经成型
  • Debian下无root权限使用Python访问Oracle
  • Javascript编码规范
  • Java基本数据类型之Number
  • Laravel 菜鸟晋级之路
  • Mac转Windows的拯救指南
  • Mithril.js 入门介绍
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • socket.io+express实现聊天室的思考(三)
  • Spark学习笔记之相关记录
  • Spring Cloud Feign的两种使用姿势
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 算法-图和图算法
  • 一个完整Java Web项目背后的密码
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​Java并发新构件之Exchanger
  • ​水经微图Web1.5.0版即将上线
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (2)STM32单片机上位机
  • (LeetCode) T14. Longest Common Prefix
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (九)信息融合方式简介
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三分钟)速览传统边缘检测算子
  • (十八)三元表达式和列表解析
  • (十六)视图变换 正交投影 透视投影
  • (四)stm32之通信协议