跳到主要内容

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

重要注意事项

  1. 路径必须以点 (.) 开头
  2. 字符串值必须正确转义
  3. 数组是基于零索引的
  4. 设置不存在的父路径将失败
  5. 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
  • 多个过滤器可以通过 && 和 || 组合