当前位置: 首页 > 知识库问答 >
问题:

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

燕禄
2024-06-11

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

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

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

共有2个答案

席嘉祯
2024-06-11

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

可以试试这个解决方案:

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

public class MyPojo {    @JsonProperty("username")    private String username;    // 其他字段和getter/setter}
邹誉
2024-06-11

处理 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 匹配,但异常仍然发生,那么可能需要进一步检查你的代码或数据,看看是否有其他隐藏的问题。

 类似资料:
  • 我在试着读我的。json文件。Is是一个车辆存储类。 这是错误: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造的实例(尽管至少存在一个Creator):无法构造的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法来从[Source:(File); line: 1,列: 1]处的字符串值反序列化

  • 我有以下课 以及以下测试: 我收到以下错误: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.store.domain.model.Cart实例(尽管至少存在一个Creator):无法从[Source:(String)"{"id":"56c7b5f7-115b-4cb9-9658-acb7b849d5d5"}"

  • 问题内容: 我有一个Vendor对象,可以从一个单独的“ vendor” json序列中反序列化,但是我想将此序列反序列化为一个,我只是想不出如何让Jackson合作。有小费吗? 问题答案: 您的数据存在问题,因为您的数组中有内部 包装 对象。想必你的对象被设计成手柄,,,但每次的多个对象也都包裹在一个对象与单一属性。 我假设您正在使用Jackson 数据绑定 模型。 如果是这样,那么有两件事要考

  • 问题内容: 我的问题很简单:我有以下简单的类: 我正在尝试处理以下JSON: 显然,这里存在一个问题(“ blah”无法解析为int) 以前,Jackson抛出类似org.codehaus.jackson.map.JsonMappingException的内容:无法从字符串值’blah’构造java.lang.Integer的实例:不是有效的Integer值 我同意这一点,但是我想在某个地方注册一

  • 如何在批处理模式的情况下处理反序列化异常? 我正在使用Spring boot-2.3.8版本的Spring kafka。 尝试过此选项: 但它抛出了一个异常:由java引起。lang.IllegalStateException:错误处理程序必须是ErrorHandler,而不是org。springframework。Kafka。听众。请参阅OcuCurrentBatchErrorHandler 以

  • 我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?

  • 我对解析json有一个问题。它有一个日期为exapmle-"2014-01-07"。当它解析并成为createUserRequest.getBirthday()时,它包含-"2014-01-07T04:00:00.000 04:00"。我需要它在createUserRequest对象中,然后我会用另一个对象断言它。问题是如何得到“2014-01-07”? 在CreateUserRequest中,我

  • 我使用Json-Jackson序列化/反序列化我的对象,并且与内置类配合得很好。 字符串、int等非常好。但是现在我必须序列化/反序列化以特定方式构建的对象。遵循声明: 如果我使用标准的序列化器/反序列化,它会向我显示一条错误消息,例如“java.lang.不支持的操作异常...”,因此它无法序列化/反序列化bobjs。 我如何以一般方式做到这一点,所以我不写3个序列化器/反序列化器,而是只告诉J