今天使用 LangChain 对一个 JSON 文件的数据进行 RAG 处理时,在使用 jsonLoader 时遇到了一个陌生的参数 jq_schema。jq_schema 是 jq 工具的查询语法,而 jq 是一种轻量级的命令行工具和查询语言,专门用于解析、过滤和转换 JSON 数据。在这里,我将简单记录一下常见的 jq_schema 语法。
基本语法
-
.(根节点):选择整个 JSON 数据。{ "name": "Alice", "age": 25 }表达式:
.结果:{ "name": "Alice", "age": 25 } -
.key:选择对象中的特定键。 表达式:.name结果:"Alice" -
.key1.key2:选择嵌套对象中的键。{ "user": { "name": "Alice", "details": { "age": 25 } } }表达式:
.user.details.age结果:25 -
.[]:选择数组中的每个元素。[1, 2, 3, 4]表达式:
.[]结果:1 2 3 4 -
.[index]:选择数组中的特定元素。[10, 20, 30, 40]表达式:
.[1]结果:20
高级语法
-
筛选和条件:
-
选择数组中满足条件的元素:表达式:
.[] | select(.id > 1)结果:[ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}, {"id": 3, "name": "Charlie"} ]{"id": 2, "name": "Bob"} {"id": 3, "name": "Charlie"}
-
-
管道操作符
|:- 将一个表达式的输出作为下一个表达式的输入。
{ "users": [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30} ] }表达式:
.users[] | .name结果:"Alice" "Bob" -
字符串处理:
{ "message": "Hello, world!" }表达式:
.message | ascii_upcase结果:"HELLO, WORLD!" -
计算和数学运算:
[1, 2, 3, 4]表达式:
map(. * 2)结果:[2, 4, 6, 8]
案例分析
-
提取 JSON 对象中的多个字段:
{ "user": { "name": "Alice", "age": 25, "location": "Wonderland" } }表达式:
{name: .user.name, age: .user.age}结果:{ "name": "Alice", "age": 25 } -
将数组元素提取为特定格式:
[ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"} ]表达式:
.[] | "\\\\(.id): \\\\(.name)"结果:"1: Alice" "2: Bob"
有用的函数
-
length:返回数组或字符串的长度。[1, 2, 3, 4, 5]表达式:
length结果:5 -
map:对数组中的每个元素应用一个表达式。[1, 2, 3]表达式:
map(. * 2)结果:[2, 4, 6] -
has(key):检查对象中是否存在某个键。{"name": "Alice", "age": 25}表达式:
has("age")结果: