【问题标题】:Jackson custom complex deserializer into classesJackson 自定义复杂反序列化器到类中
【发布时间】: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


【解决方案1】:

使用Jackson Json parser。它可以根据您的示例轻松地将 Json 字符串自动解析为 Java 对象。

您也可以按照您在 Class10 示例中提到的那样进行手动解析。 Jackson 可以作为 DomParser 将 Json 读取为树并捕获特定字段。

它还有很多其他功能。但我认为你最感兴趣的是这两个。

您可以在此处找到详细信息和示例代码https://www.digitalocean.com/community/tutorials/jackson-json-java-parser-api-example-tutorial

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 2011-04-12
    • 2016-01-29
    • 1970-01-01
    • 2019-08-10
    • 2017-09-10
    • 2016-02-12
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多