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

jackson数组对单对象java属性的反序列化

支嘉祥
2023-03-14

我对班级结构有如下建议:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,PROPERTY=“type”)

    @JsonSubTypes({
            @JsonSubTypes.Type(name = "testA", value = TestA.class),
            @JsonSubTypes.Type(name = "testB", value = TestB.class),
            @JsonSubTypes.Type(name = "testC", value = TestC.class)
    })
    public abstract class Test {

    }


    public class TestA extends Test {
        private String firstName;
        private String secondName;
        private String surName;
    }

    public class TestB extends Test {
        private String adressLine1;
        private String adressLine2;
        private String adressLine3;
    }


    public class TestC extends Test {
        private String hobby1;
        private String hobby2;
        private String hobby3;
    }

上面的类被序列化为json元素数组,但是当我反序列化它们时,我想要如下结构:

公共阶层结构{

   private TestA testA;
   private TestB testB;
   private TestC testC;

   public void setTestA(TestA testA){
     this.testA = testA;   
} 

 public TestA getTestA(){
   return testA;
}
 .....getter and setter for testB and testC... 
} 

是否可以将testA、testB和testC类型的元素数组转换为FlatStructure类的属性?

共有1个答案

高森
2023-03-14

您可以添加带有注释@JsonCreator的构造函数

,在每堂课的测试中

和另一个在你的平面结构类中,之后你使用一个ObjectMapper来创建你的类平面结构

我建议在构造函数上也使用annotations@JsonProperty

查看此链接

http://buraktas.com/convert-objects-to-from-json-by-jackson-example/

我认为那个

    public class TestA extends Test {
    .....
    @JsonCreator
    public TestA(@JsonProperty("firstName") String name,
                 @JsonProperty("secondName") String secondeName,                 
                 @JsonProperty("surName") String surName){
       this.firstName=name;
       this.secondeName=secondeName;
       this.surName=surName;

   }



   ... getter, setter .....
}

  public class TestB extends Test {
    .....
        @JsonCreator
    public TestB(@JsonProperty("adressLine1") String adressLine1,
                 @JsonProperty("adressLine2") String adressLine2,                 
                 @JsonProperty("adressLine3") String adressLine3){
       this.adressLine1=adressLine1;
       this.adressLine2=adressLine2;
       this.adressLine3=adressLine3;
   }



   ... getter, setter .....
}

    public class TestC extends Test {
    .....
        @JsonCreator
    public TestC(@JsonProperty("hobby1") String hobby1,
                 @JsonProperty("hobby2") String hobby2,                 
                 @JsonProperty("hobby3") String hobby3){
       this.hobby1=hobby1;
       this.hobby2=hobby2;
       this.hobby3=hobby3;
   }

   ... getter, setter .....
}


public class FlatStructure{
       private TestA testA;
       private TestB testB;
       private TestC testC;

      @JsonCreator
       public FlatStructure(@JsonProperty("testA") testA testa,
                            @JsonProperty("testB") testB testb,                 
                            @JsonProperty("testC") testC testc){
       this.testA =testa;
       this.testB =testb;
       this.testC =testc;
   }


   ... getter, setter .....
}

应该可以与地图绘制程序正常工作

编辑:

使用Jackson自定义JSON反序列化

http://www.baeldung.com/jackson-deserialization

 类似资料:
  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 我有以下JSON文件要反序列化

  • 问题内容: 支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:

  • 鉴于这种反应: 我怎样才能将数据属性反序列化为像这样的 MapDTO 我已经尝试使用自定义反序列化器,但是按名称获取所有属性,然后基于这些属性和嵌套对象创建一个新的MapDTO对象看起来很麻烦。如果结构发生变化,我必须更改反序列化器和DTO本身。让Jackson从给定的根开始进行反序列化会更容易。我使用Jackson 2.12.4到ResAs的4.4.0。我想避免创建不必要的包装类。

  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?

  • 给定一个JSON对象,它具有可变属性(例如标签),可以是原始值(例如字符串)或对象。假设的用例可以是标签多元化翻译的包装器: 或者 目标是使Jackson反序列化始终在Java端返回固定结构。因此,如果给定原语值,它总是转换为目标POJO的某个属性(例如其他),即: 目前,该问题通过使用自定义来解决,它检查属性是否为原语: 是否有一种更优雅的方法来处理可变JSON属性,而不需要在节点级别操作的解码