redis操作报错-Unexpected character (‘-‘ (code 45)): Expected space separating root-level values

本文介绍了一个关于com.fasterxml.jackson.core.JsonParseException的问题,详细说明了错误出现的原因及如何通过统一使用RedisTemplate实例来解决此问题。

com.fasterxml.jackson.core.JsonParseException: Unexpected character (’-’ (code 45)): Expected space separating root-level values
at [Source: (byte[])“2021-11-17 18:48:51”; line: 1, column: 6]

我遇到原因是 一位同事用的下面的属性写的

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

然后用的下面读取的。。

    @Autowired
    private RedisTemplate redisTemplate;

解决办法:统一一个就好

Jackson 报错 `JsonParseException: Unexpected character ('=' (code 61)): Expected space separating root-level values` 表示 JSON 解析器在解析输入流时遇到了意外字符 `'='`,而期望的是分隔根级值的空格。该错误通常发生在输入内容并非合法 JSON 格式的情况下。 ### 常见原因与解决方法 1. **非法或格式错误的输入数据** 输入的内容可能包含非标准 JSON 数据,例如 URL 查询参数格式(如 `key=value&...`)而非 JSON 对象。Jackson 默认情况下无法处理这种格式的数据,应使用适当的解析器或转换逻辑来处理此类内容[^2]。 示例:如果请求体是 `application/x-www-form-urlencoded` 类型,而不是 JSON 格式,则 Jackson 会尝试将其作为 JSON 解析并抛出异常。可以通过配置 `FormHttpMessageConverter` 来正确处理表单编码格式。 2. **特殊字符未进行编码** 如果输入中包含特殊字符(如 `%`, `=`, `&` 等),这些字符在某些上下文中具有特殊含义(例如 URL 编码),需要在传输前进行转义处理。例如,在 Java 中可以使用 `URLEncoder.encode()` 和 `URLDecoder.decode()` 来处理含特殊字符的字段[^4]。 ```java // 调用接口之前对字段进行编码 String encodedValue = URLEncoder.encode("value_with_special_chars", "UTF-8"); // 接收响应后解码 String decodedValue = URLDecoder.decode(encodedValue, "UTF-8"); ``` 3. **检查 HTTP 请求头和内容类型匹配性** 确保客户端发送的 `Content-Type` 头与实际发送的数据格式一致。例如,若使用 JSON 格式提交数据,应设置为 `application/json`;若为表单提交,则应为 `application/x-www-form-urlencoded`。否则 Spring 的 `MappingJackson2HttpMessageConverter` 可能会尝试以 JSON 方式解析非 JSON 数据并导致解析失败[^2]。 4. **使用自定义反序列化逻辑** 若输入源不是标准 JSON 流(例如来自 Redis、Netty 缓冲区等),则可能需要实现自定义的反序列化逻辑,确保输入数据结构符合 Jackson 的预期格式。例如,在 Netty 场景中读取 `ByteBufInputStream` 时需确保其内容为有效的 JSON 字符串[^3]。 5. **验证 JSON 数据结构** 在调用 Jackson 的 `ObjectMapper` 或相关 API 之前,建议先通过在线 JSON 验证工具或日志输出原始字符串的方式检查 JSON 内容是否完整且语法正确。 ### 总结 此异常的核心在于 Jackson 收到了不符合 JSON 语法规范的输入。解决思路包括: - 检查输入来源是否为合法 JSON; - 针对非 JSON 格式内容采用相应解析方式; - 对特殊字符进行编码/解码处理; - 配置合适的 `HttpMessageConverter` 以适配不同类型的请求体。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值