如何处理JSON库反序列化时MismatchedInputException异常?

在使用JSON库(如Jackson)反序列化时,如果JSON数据与目标类型不匹配,会抛出MismatchedInputException异常。

通过下面的代码可以复现问题。

ObjectMapper mapper = new ObjectMapper();
String json = "{\"username\": \"Alice\", \"age\": 25}";
MyPojo pojo = mapper.readValue(json, MyPojo.class);
阅读 1k
avatarAI BotBETA

处理 MismatchedInputException 异常通常涉及检查你的 JSON 数据是否与目标 Java 类的字段完全匹配。这包括字段名称、类型以及结构(例如,列表或对象)。以下是一些建议的步骤来解决这个问题:

  1. 检查字段名称和类型
    确保 JSON 中的字段名称和类型与 MyPojo 类中的字段名称和类型完全匹配。例如,如果 MyPojo 类有一个 String 类型的 name 字段,而 JSON 包含一个 username 字段,则会发生不匹配。
  2. 使用注解
    如果字段名称不匹配,但你有意让它们这样(例如,为了遵循某些 API 的约定),你可以使用 Jackson 注解(如 @JsonProperty)来指定 JSON 字段应该映射到哪个 Java 字段。
  3. 检查嵌套结构
    如果 MyPojo 类包含嵌套的对象或列表,确保 JSON 数据的结构与之匹配。例如,如果 MyPojo 有一个 List<String> 类型的字段,确保 JSON 中对应的是一个数组。
  4. 处理可选字段
    如果某些字段是可选的,你可以使用 @JsonIgnoreProperties(ignoreUnknown = true) 注解来忽略未知字段,或者为这些字段设置默认值。
  5. 自定义反序列化
    对于复杂的反序列化逻辑,你可以创建自定义的反序列化器来处理特定情况。
  6. 异常处理
    在代码中添加异常处理逻辑来捕获 MismatchedInputException 并提供适当的错误消息或处理逻辑。

例如,你可以这样捕获异常:

ObjectMapper mapper = new ObjectMapper();
String json = "{\"username\": \"Alice\", \"age\": 25}";
try {
    MyPojo pojo = mapper.readValue(json, MyPojo.class);
    // 处理 pojo 对象...
} catch (MismatchedInputException e) {
    // 处理异常,例如打印错误消息或记录日志
    System.err.println("JSON 数据与目标类型不匹配: " + e.getMessage());
}

如果 MyPojo 类的定义与 JSON 数据不匹配,你需要修改 MyPojo 类以匹配 JSON 结构,或者使用注解来指定如何映射字段。如果你已经确定 MyPojo 类与 JSON 匹配,但异常仍然发生,那么可能需要进一步检查你的代码或数据,看看是否有其他隐藏的问题。

1 个回答

这个问题我遇到过,类型不匹配异常 MismatchedInputException。

可以试试这个解决方案:

确保JSON数据与目标类型匹配,包括字段名称和数据类型。可以使用@JsonProperty注解或自定义反序列化器来处理不匹配的字段。

public class MyPojo {
    @JsonProperty("username")
    private String username;
    // 其他字段和getter/setter
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏