如何通过RedisJSON的JSON.GET获取无括号引号的纯值?
解决RedisJSON返回结果去除括号和引号的问题
针对你的场景(Redis v6 + RedisJSON v2.2.0),可以通过以下方式优化返回结果:
第一步:精准定位路径减少外层括号
你的原始JSON是数组结构,使用$.msg会匹配数组内所有元素的msg字段,因此返回数组格式["hello"]。如果只需要数组第一个元素的msg值,将查询路径改为$[0].msg:
redisReply *reply = redisCommand(context, "JSON.GET sample-rj $[0].msg");
此时返回结果会变成"hello",已经去掉了外层括号,但仍保留双引号。
第二步:处理双引号的两种方案
RedisJSON v2.2.0本身没有直接返回不带引号原始字符串的内置参数(因为JSON.GET的返回结果始终遵循JSON格式规范),所以有两种可选方案:
方案1:客户端自行处理
在C代码中对返回的字符串做简单截取:由于返回的是带双引号的字符串(如"hello"),可以直接取字符串的第2个字符到倒数第2个字符的子串。示例代码片段:
if (reply->type == REDIS_REPLY_STRING) { size_t len = strlen(reply->str); if (len >= 2 && reply->str[0] == '"' && reply->str[len-1] == '"') { // 提取不带引号的内容 char *pure_val = malloc(len - 1); strncpy(pure_val, reply->str + 1, len - 2); pure_val[len - 2] = '\0'; // 使用pure_val... free(pure_val); } }
方案2:Redis端通过Lua脚本处理
编写Lua脚本在Redis内部完成去引号操作,避免客户端额外处理。示例脚本调用:
redisReply *reply = redisCommand(context, "EVAL \"local val = redis.call('JSON.GET', 'sample-rj', '$[0].msg'); return string.sub(val, 2, -2)\" 0");
该脚本会先获取带引号的字符串,再通过string.sub去掉首尾的双引号,直接返回hello。注意:此方案仅适用于msg字段为字符串类型的场景,如果字段可能是数字、布尔值等其他类型,需要在脚本中添加类型判断逻辑。
综上,如果你只需要去掉外层括号,修改查询路径即可;如果要完全去掉括号和引号,要么在客户端做简单截取,要么用Lua脚本在Redis端处理,RedisJSON本身没有直接的配置项实现该需求。
内容的提问来源于stack exchange,提问作者user964491
相关产品推荐
相关产品推荐

