You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:30:58