java - 无法反序列化 json:MismatchedInputException。使用静态类
问题描述
我正在使用帮助内部类来反序列化一些输入。当我使用静态类时,反序列化有效。
public class Test {
public static void main(String[] args) throws IOException {
String message = "{\"location\":\"https://some.com\"}";
URL url = new ObjectMapper()
.readValue(message, Loc.class).getLocation();
System.out.println(url.toString());
}
@Getter
@Setter
private class Loc {
URL location;
}
}
在上面运行主类时出现错误:
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `Test$H$Loc` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor
at [Source: (String)"{"location":"https://some.com"}"; line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1032)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1294)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
当我将类设为静态时,一切正常。但我需要非静态类。怎么了?
UPD:我可以通过将 Loc 类设为外部而不是内部类来解决这个问题。我的问题是,当我想将 Loc 作为内部类时,为什么我应该将其设为静态以进行序列化?UPD:删除了无关紧要的内部类 H
解决方案
为什么需要这么奇怪的结构?但是无所谓。如果你想要这样的结构,你需要让你的H
班级static
以及Loc
:
公共类测试{
public static void main(String[] args) throws IOException {
String message = "{\"location\":\"https://some.com\"}";
URL url = new ObjectMapper()
.readValue(message, H.Loc.class).getLocation();
System.out.println(url.toString());
}
private static class H {
@Getter
@Setter
@NoArgsConstructor
private static class Loc {
URL location;
}
}
}
推荐阅读
- finder - afp 看不到 zfs 挂载的文件夹
- google-bigquery - Google Big Query 在表名中间使用通配符
- eclipse - 新计算机,Eclipse IDE 的解决问题
- sql-server - 为什么从自连接临时表更新真实表不起作用但使用真实表时它可以工作?
- python - 如何使用 bash 在文件更改时设置脚本 RELOAD/RESTART?
- python - tf.saved_model.simple_save 中的输入和输出是什么?
- amazon-web-services - 如何在 cloudformation yaml 文件中指定使用参数值,否则通过 FindInMap 使用默认值
- html - 将按钮上方的图片居中到不同的网页
- mysql - Alter 语句在 MySQl 中工作但在 MAriaDB 中不工作?
- python - Django 不在用户模型中存储密码字段