如何用Redis JSON.GET获取指定属性且兼容缺失属性并保留原结构
RedisJSON查询:兼容缺失属性并返回标准JSON结构的方法
要实现指定属性查询、兼容缺失属性、且返回与全量查询一致的JSON结构,可以用RedisJSON的JSONPath多属性投影语法,以下是具体方案:
核心解决方案(RedisJSON 2.0+)
使用JSONPath的数组投影语法,一次性指定所有要查询的属性:
JSON.GET Cat:1 $["name","color","food"]
执行后返回结果完全符合预期:
{"name":"Mitzi","color":"pink"}
这个方案的特点:
- 不会因属性缺失抛出错误:不存在的
food属性会被自动忽略,不会触发ERR Path does not exist - 返回结构和全量查询一致:没有多余的
$.前缀,值也不会被数组包裹,直接返回标准键值对对象 - 语法简洁,无需额外处理
如果需要显示缺失属性的默认值
如果希望缺失的属性(比如food)显示为默认值(如空字符串、null),可以通过临时合并模板对象实现:
# 1. 创建临时键,存入包含默认值的模板对象 JSON.SET Temp:Cat:1 $ '{"food":""}' # 2. 将目标对象的存在属性合并到临时键中 JSON.MERGE Temp:Cat:1 $ $(JSON.GET Cat:1 $["name","color"]) # 3. 查询结果 JSON.GET Temp:Cat:1 # 4. 清理临时键 JSON.DEL Temp:Cat:1
执行后返回:
{"name":"Mitzi","color":"pink","food":""}
为什么之前的方法不适用?
- 方法1(
JSON.GET Cat:1 $.name $.color $.food):这是多路径独立查询,返回的是「路径→结果」的映射结构,因此会带有$.前缀和数组包裹,无法直接反序列化为目标对象 - 方法2(
JSON.GET Cat:1 name color food):这种简化路径语法要求所有指定属性必须存在,只要有一个缺失就会报错,不兼容缺失场景
内容的提问来源于stack exchange,提问作者marina
相关产品推荐
相关产品推荐

