【发布时间】:2022-11-23 04:11:37
【问题描述】:
我需要为我的 json 字符串使用自定义反序列化器。问题是我要序列化的类非常复杂并且是从其他类构造的。但是互联网上的所有示例都只显示了反序列化 json 的非常基本的方法(即只按名称检索一个值并获取它的值),但是我有子类并且想使用它们所以我不需要手动编写所有映射。有什么办法可以做到这一点?理解我在说什么的例子,假设我有这个结构:
public TestClass{
public Class1 first;
public Class2 second;
...
public Class10 ten;
}
所有的类都包含数据,如下所示:
public Class1{
public String name;
public int id;
...
}
显然我不想手动映射所有这些,但互联网上的所有示例都表明,有没有办法直接将值读入类而不需要进行手动映射?例如最常见的例子是做这样的事情:
@Override
public Item deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
int id = (Integer) ((IntNode) node.get("id")).numberValue();
String itemName = node.get("itemName").asText();
int userId = (Integer) ((IntNode) node.get("createdBy")).numberValue();
return new Item(id, itemName, new User(userId, null));
}
所以我的问题是我可以更轻松地做到这一点,即将值直接读入这些类吗? (除了一个,这就是为什么我首先需要自定义反序列化,但最好只编写一个手动映射而不是 10 个)。 总结一下,我想做这样的事情:
@Override
public Item deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
...
Testclass test = new Testclass();
Class1 class1 = json...parse(..., Class1.class);
Class2 class2 = json...parse(..., Class2.class);
...
test.setClass1(class1);
test.setClass2(class2);
...
Class10 manualClass = new Class10();
manualClass.setField1(json.get("class10").get("field1").stringValue());
...
test.setClass10(manualClass);
}
【问题讨论】:
-
请显示要处理的json结构
-
@MarcStroebel,我已经在问题中展示了例子,你不需要知道我的确切结构来告诉我怎么做
-
通用解决方案是使用自定义转换器 ;-) 优化你需要了解的细节......
-
@MarcStroebel,我添加了更详细的示例,如果它能以某种方式提供帮助的话
-
并阅读这篇文章JSON to Java Object。所以注解类,属性,不如使用objectMapper。
标签: java json spring-boot jackson deserialization