JSON 模块
以下是 JSON 模块命令的完整列表及其在 Garnet 中的实现状态。
请注意,随着我们不断发展壮大的社区帮助我们扩展 API 命令支持,此列表可能会有所更改。
Json 命令列表
命令 | 已在 Garnet 中实现 | 注意事项 |
---|---|---|
JSON.GET | ➕ | |
JSON.SET | ➕ | |
JSON.DEL | ➖ | |
JSON.TYPE | ➖ | |
JSON.NUMINCRBY | ➖ | |
JSON.NUMMULTBY | ➖ | |
JSON.STRAPPEND | ➖ | |
JSON.STRLEN | ➖ | |
JSON.ARRAPPEND | ➖ | |
JSON.ARRINDEX | ➖ | |
JSON.ARRINSERT | ➖ | |
JSON.ARRLEN | ➖ | |
JSON.ARRPOP | ➖ | |
JSON.ARRTRIM | ➖ | |
JSON.OBJKEYS | ➖ | |
JSON.OBJLEN | ➖ |
命令详情
JSON.GET
语法
JSON.GET key [INDENT indent-string] [NEWLINE newline-string] [SPACE space-string] [path [path ...]]
参数
- key: 存储 JSON 文档的键
- INDENT: (可选) 用于美观打印的缩进字符串
- NEWLINE: (可选) 用于美观打印的换行符字符串
- SPACE: (可选) 用于美观打印的空格字符串
- path: (可选) JSONPath-like 表达式,用于指定要检索的元素
响应格式
返回以下之一
- 批量字符串: 如果路径匹配,则返回 JSON 编码的值
- 数组: 当请求多个路径时
- Null: 如果键或路径不存在
示例
# Store a complex JSON object
JSON.SET example $ '{"name":"John","address":{"city":"London","postal":"SW1A"},"contacts":[{"type":"email","value":"john@example.com"},{"type":"phone","value":"123-456-789"}]}'
# Get entire document with pretty printing
JSON.GET example . INDENT " " NEWLINE "\n"
-> {"name":"John","address":{"city":"London","postal":"SW1A"},"contacts":[{"type":"email","value":"john@example.com"},{"type":"phone","value":"123-456-789"}]}
# Get multiple specific paths
JSON.GET example .name .address.city .contacts[0].value
-> ["John","London","john@example.com"]
# Get array elements with filter
JSON.GET example .contacts[?(@.type=="email")].value
-> ["john@example.com"]
JSON.SET
语法
JSON.SET key path value [NX | XX]
参数
- key: 用于存储 JSON 文档的键
- path: JSONPath-like 表达式,指定要设置的位置
- value: 有效的 JSON 值或字符串表示
- NX: 仅当键不存在时才设置键
- XX: 仅当键已存在时才设置键
响应格式
返回以下之一
- "OK": 操作成功
- Null: 操作失败(在使用 NX/XX 条件时)
示例
# Set with NX (only if not exists)
JSON.SET user:3 $ '{"name":"Bob"}' NX
-> OK
# Set with XX (only if exists)
JSON.SET user:3 .age '25' XX
-> OK
# Modify nested array
JSON.SET user:3 .profile.interests[1] '"reading"'
-> OK
重要注意事项
- 路径必须以点 (.) 开头
- 字符串值必须正确转义
- 数组是基于零索引的
- 设置不存在的父路径将失败
- NX 和 XX 互斥
支持的 Json 路径语法
路径类型 | 语法 | 描述 | 示例 | 注意事项 |
---|---|---|---|---|
根 | . 或 $ | 引用根 JSON 文档 | JSON.GET key $ | 两种表示法都支持 |
属性访问 | .property 或 $.property | 访问对象的直接属性 | JSON.GET key $.name | 区分大小写 |
嵌套属性 | .prop1.prop2 或 $.prop1.prop2 | 访问嵌套对象属性 | JSON.GET key $.address.city | |
数组索引 | .array[n] 或 $.array[n] | 访问索引 n 处的数组元素 | JSON.GET key $.users[0] | 零基索引 |
数组切片 | .array[start:end] | 检索从 start 到 end 的数组元素 | JSON.GET key $.users[1:3] | 结束索引不包括在内 |
数组最后一个元素 | .array[-1] | 访问数组的最后一个元素 | JSON.GET key $.users[-1] | |
所有数组元素 | .[*] 或 $[*] | 选择数组中的所有元素 | JSON.GET key $[*] | |
数组过滤 | .[?(@.prop==value)] | 按条件过滤数组元素 | JSON.GET key $.users[?(@.age>21)] | |
多个路径 | .prop1 .prop2 | 一次检索多个路径 | JSON.GET key $.name $.age | |
通配符 | .* 或 $.* | 选择对象的所有属性 | JSON.GET key $.address.* | |
数组追加 | .[+] | 追加到数组(仅限 SET) | JSON.SET key $.list[+] value | 目前不支持 |
数组范围 | .[start:] | 选择从开始到结束的元素 | JSON.GET key $.list[2:] | |
条件 | .[?(@.size=="L")] | 复杂的数组过滤 | JSON.GET key $.items[?(@.size=="L")] | 支持多个条件 |
嵌套数组 | .[*][0] 或 $[*][0] | 访问嵌套数组元素 | JSON.GET key $.matrix[*][0] |
特殊考虑
- 数组索引是基于零的
- 属性名区分大小写
- 无效路径返回 null
- 多个过滤器可以通过 && 和 || 组合