解决 Cannot deserialize instance of java.lang.String out of START_OBJECT token 错误记

2024-02-23 17:55:30 浏览数 (3)

最近在代码迁移过程中,遇到了 JSON 解析失败的问题。具体表现为出现 "Cannot deserialize instance of java.lang.String out of START_OBJECT token" 错误。经过仔细研究和调试,发现问题的根源在于之前使用的 fastjson 转换库被替换为 jackson 后无法正确读取数据。

针对这个问题,我们需要做一些调整和更改。首先,让我们来看一下相关的代码内容:

代码语言:javascript复制
/**
 * 微盟基础响应类
 */
public class WeimobShopBaseResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 响应码
     */
    private WeimobShopCode code;

    /**
     * 响应结果
     */
    private String data;

    // 省略 getter 和 setter 方法
}

在原有代码中,我们将响应数据统一定义为 String 类型,以便后续根据具体业务再次解析。然而,由于 jackson 库不能正确处理这种情况,我们需要采取另外一种方法来解决这个问题。

我们可以利用 jackson 的 readTree 方法将 JSON 字符串转换为 JsonNode 对象,再从中提取出 codedata 进行单独解析。下面是相应的代码示例:

代码语言:javascript复制
// 创建 ObjectMapper 实例
ObjectMapper objectMapper = new ObjectMapper();

// 使用 readTree 方法将 JSON 字符串转换为 JsonNode 对象
JsonNode jsonNode = objectMapper.readTree(jsonString);

// 获取 JsonNode 中的值
String code = jsonNode.get("code").asText();
String data = jsonNode.get("data").asText();

通过以上方式,我们可以成功解析 JSON 数据并获取到 codedata 的数值,避免了 "Cannot deserialize instance of java.lang.String out of START_OBJECT token" 错误的发生。

通过这次经历,我们学到了在使用不同的 JSON 转换库时需要注意其差异,及时调整代码以适配新的转换库,保证代码的正常运行。希望这篇文章对你在类似情况下有所帮助。

1 人点赞