Jedis调用jsonSet时报错:expected value at line 1 column 1
排查Jedis jsonSet抛出"expected value at line 1 column 1"异常的原因
以下是几个常见的排查方向和解决方案:
1. Redis服务器未安装RedisJSON模块
这是触发该异常最常见的原因。Jedis的jsonSet方法依赖RedisJSON扩展模块提供的JSON.SET命令,原生Redis并不支持这类JSON操作命令。当Redis收到未识别的命令时,返回的错误信息会导致Jedis解析失败,抛出该异常。
- 验证方法:登录Redis客户端执行命令
JSON.SET test . '{"discordName":"testName"}',如果返回(error) ERR unknown command 'JSON.SET',说明确实未安装RedisJSON。 - 解决办法:切换使用Redis Stack(内置RedisJSON等模块),或者手动为现有Redis实例加载RedisJSON模块。
2. User对象序列化异常
Jedis默认通过Jackson将Java对象序列化为JSON字符串,如果User类的序列化配置不规范,可能导致生成的JSON为空或格式非法,进而触发Redis的格式校验错误。
- 验证方法:手动序列化User对象,检查输出是否为合法JSON:
如果输出为空、缺失字段或抛出序列化异常,需要修正ObjectMapper mapper = new ObjectMapper(); try { String json = mapper.writeValueAsString(new User().setDiscordName("testName")); System.out.println(json); } catch (JsonProcessingException e) { e.printStackTrace(); }User类的配置:- 确保类有标准的getter/setter方法,或使用Lombok的
@Data注解自动生成; - 链式调用的setter方法需返回
this,否则对象属性可能未正确赋值; - 若字段有特殊命名,添加
@JsonProperty注解指定JSON键名。
- 确保类有标准的getter/setter方法,或使用Lombok的
3. Jedis版本兼容性问题
部分旧版本Jedis对RedisJSON的命令支持存在缺陷,比如参数传递格式不匹配,导致Redis无法识别请求内容。
- 解决办法:将Jedis依赖升级到最新稳定版本,确保与RedisJSON版本兼容。
4. 连接的Redis实例不符
即使ping()方法执行成功,也可能存在连接到了未加载RedisJSON模块的Redis实例(比如本地测试Redis和生产Redis混淆)。
- 验证方法:在Redis客户端执行
INFO modules,查看输出中是否包含ReJSON模块信息。
额外代码优化建议
可以显式指定JSON路径参数(.表示根路径),避免因参数缺失导致的问题:
public <T> void insertJson(String key, T object) { unifiedJedis.jsonSet(key, ".", object); }
内容的提问来源于stack exchange,提问作者dev-rifaii
相关产品推荐
相关产品推荐

