jackson 주석을 사용하여 다중 수준 다형성 하위 유형을 역 직렬화합니다.

프리 얀카 샤르마

jackson 주석을 사용하여 2 단계 다형성 하위 유형을 역 직렬화하고 싶습니다. 기본적으로 다음과 같이 json 주석과 잭슨을 사용하여 다음 json을 xml로 변환하고 싶습니다.

{
  "mainSet": {
    "name": "bla bla",
    "myItems": [
      {
        "MySubItem": {
          "id": 1,
          "name": "Value1",
          "itemAProperty1": "Some stuff",
          "itemAProperty2": "Another property value",
          "type": "MySubItemA"
        }
      },
      {
        "MySubItem": {
          "id": 2,
          "name": "Value2",
          "itemBProperty1": 1000,
          "itemBProperty2": "B property",
          "type": "MySubItemB"
        }
      }
    ]
  }
}

그리고 내가 원하는 최종 Xml은

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mainTag schemaVersion="1" xmlns="http://www.utiba.com/xml/ns/brms/v1"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <name>bla bla</name>
    <MySubItem xsi:type="MySubItemA" id="1" name="value1" itemAProperty1="Some stuff" itemAProperty2="Another property value"/>
    <MySubItem xsi:type="MySubItemB" id="2" name="value2" itemAProperty1=1000 itemAProperty2="B Property"/>
</mainTag>

다음 클래스 세트가 있습니다-메인 클래스

public abstract class MyItem {

private int id;
private String name;
 //getter and setter
}

추상 하위 클래스가

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MySubItem")
@XmlSeeAlso({
    MySubItemA.class,
    MySubItemB.class,
    MySubItemC.class
})
    public abstract class MySubItem extends MyItem {

    private String itemAProperty1;
    private String itemAProperty2;
     //getter and setter
    }

MySubItem에는 MySubItemA, MySubItemB, MySubItemC라는 구체적인 하위 클래스가 있습니다.

이제 마지막으로 추상 클래스의 객체 목록을 포함하는 클라이언트 클래스를 만듭니다.

 import java.util.ArrayList;
    import java.util.List;

    public class MainSet{
     @XmlElements({
        @XmlElement(name = "MysubItem", type = MySubItem.class),
    })
    private List<MyItem> myItems;

      public List<MyItem> getMyItems() {
        return this.myItems;
    }
    }

MyItem에 대한 Mixin 클래스를 만들려고했습니다.

@JsonTypeInfo(use=Id.MINIMAL_CLASS, include=As.PROPERTY, property="itemType")
@JsonSubTypes({
   @Type(MySubItem.class)
})

및 MySubItem

@JsonTypeInfo(use=Id.MINIMAL_CLASS, include=As.PROPERTY, property="type")
@JsonSubTypes({
   @Type(MySubItemA.class)
   @Type(MySubItemB.class)
   @Type(MySubItemC.class)
})

내가 얻는 오류는 다음과 같습니다.

Error parsing JSON from client: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of MySubItem, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information
 at [Source: java.io.StringReader@26bd8952; line: 1, column: 498] (through reference chain: bla bla class ["mainSet"]->com.bla.bla["myItems"])

문제 : 2 단계의 추상 하위 클래스 계층 구조를 갖는 myItems 목록에 대한 mixin 클래스 생성

나쿨 바쉬 쉬스

여러 수준의 다형성 유형 계층 구조는 Jackson API에서 지원하지 않습니다.

https://github.com/FasterXML/jackson-databind/issues/374 에서 볼 수 있습니다.

따라서해야 할 일은 다음과 같습니다.

Deserializer (MySubItem.class의 경우 MySubItemDeserializerMixin.class라고 함)를 만들고 다른 Mixin 클래스와 마찬가지로 jsonMapper로 구성하십시오.

mapper.addMixInAnnotations(MySubItem.class, MySubItemDeserializerMixin.class);

MySubItemDeserializerMixin.java는 다음과 같습니다.

@JsonDeserialize(using = MySubItemDeserializer.class)
public abstract class MySubItemDeserializerMixin{
}

또한 MySubItemDeserializerMixin.java에 지정된대로 MySubItem에 대한 deserializer (MySubItemDeserializer)를 만들어야합니다.

이제 다음과 같은 MySubItemMixin.java를 만들어야합니다.

@JsonTypeInfo(use=Id.MINIMAL_CLASS, include=As.PROPERTY, property="type")
@JsonSubTypes({
@Type(MySubItemA.class)
@Type(MySubItemB.class)
@Type(MySubItemC.class)
})

MySubItemDeserializer에서 다음과 같은 작업을 수행합니다.

@Override
public MySubItem deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {

    JsonNode node = jsonParser.getCodec().readTree(jsonParser);

    ObjectMapper jsonMapper = new ObjectMapper();

    // Omit null values from the JSON.
    jsonMapper.setSerializationInclusion(Include.NON_NULL);

    // Treat received empty JSON strings as null Java values.
    // Note: doesn't seem to work - using custom deserializer through module
    // below instead.
    jsonMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    jsonMapper.addMixInAnnotations(MySubItem.class, MySubItemMixin.class);

    // Enable interpretation of JAXB annotations on our beans (e.g. for 
    // resolving ID/IDREF references).
    jsonMapper.registerModule(new JaxbAnnotationModule());

    MySubItem condition = jsonMapper.readValue(node.toString(), MySubItem.class); 

  }

귀하의 우려가 해결되기를 바랍니다.

감사합니다.

나쿨 바쉬 쉬스

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

jackson @JsonTypeInfo 주석을 사용하여 객체를 원래 유형으로 역 직렬화 할 수 없습니다.

분류에서Dev

Jackson은 내 통제하에 있지 않은 다형성 유형을 역 직렬화합니다.

분류에서Dev

Jackson을 사용하여 Guava의 테이블을 역 직렬화하면 "JsonMappingException : 유형에 적합한 생성자가 없습니다."가 발생합니다.

분류에서Dev

Jackson을 사용한 JSON 파일의 다형성 역 직렬화

분류에서Dev

Jackson은 Generics를 사용하여 역 직렬화합니다.

분류에서Dev

Jackson을 사용하여 여러 유형을 단일 필드로 역 직렬화

분류에서Dev

Jackson을 사용하여 Json 파일을 구문 분석 할 때 parseJason 인스턴스를 역 직렬화 할 수 없습니다.

분류에서Dev

protobuf-net을 사용하여 유형 변수를 기반으로 클래스를 동적으로 역 직렬화합니다.

분류에서Dev

Jackson을 사용하여 혼합 유형의 익명 배열을 역 직렬화하는 방법

분류에서Dev

@JsonTypeInfo 및 @JsonSubTypes를 사용하여 JSON을 다형성 개체 모델로 역 직렬화하지 않습니까?

분류에서Dev

jackson을 사용하여 동일한 ID를 가진 2 개의 개체를 포함하는 Json을 역 직렬화 할 수 없습니다.

분류에서Dev

Jackson 다형성 역 직렬화

분류에서Dev

Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

분류에서Dev

Jackson은 LocalDateTime을 역 직렬화합니다.

분류에서Dev

Jackson을 사용하여 패턴으로 속성 역 직렬화

분류에서Dev

Jackson은 주석없이 POJO로 역 직렬화합니다.

분류에서Dev

Jersey 기본 구현을 사용한 다형성 유형의 역 직렬화 : MOXy

분류에서Dev

XML 역 직렬화는 속성 유형을 확인할 수 없습니다.

분류에서Dev

JSON을 다른 필드 유형 jackson을 사용하여 하위 유형으로 언 마샬링

분류에서Dev

C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

분류에서Dev

Jackson을 사용하여 다중 인수 생성자로 스칼라 객체를 직렬화하는 방법은 무엇입니까?

분류에서Dev

현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

분류에서Dev

각 키 값에 대해 다른 개체 유형을 사용하여 JSON 파일 역 직렬화

분류에서Dev

Haskell / Aeson에서 유형 함수를 사용하여 다형성 값을 어떻게 구문 분석합니까?

분류에서Dev

JsonSubTypes없이 jackson을 사용하여 인터페이스를 특정 유형으로 역 직렬화

분류에서Dev

Jackson을 사용하여 재귀 적 Map <String, Object>를 역 직렬화 한 후 유형 안전 경고 방지

분류에서Dev

C #의 중첩 클래스를 사용하여 JSON을 역 직렬화합니다. 개체의 인스턴스를 만들 위치는?

분류에서Dev

Newtonsoft를 사용하여 단일 문자열 또는 jarray 일 수있는 경우 JSON 속성을 역 직렬화합니다.

분류에서Dev

DataContractJsonSerializerOperationFormatter는 JSON.NET을 사용하여 역 직렬화하지 않습니다.

Related 관련 기사

  1. 1

    jackson @JsonTypeInfo 주석을 사용하여 객체를 원래 유형으로 역 직렬화 할 수 없습니다.

  2. 2

    Jackson은 내 통제하에 있지 않은 다형성 유형을 역 직렬화합니다.

  3. 3

    Jackson을 사용하여 Guava의 테이블을 역 직렬화하면 "JsonMappingException : 유형에 적합한 생성자가 없습니다."가 발생합니다.

  4. 4

    Jackson을 사용한 JSON 파일의 다형성 역 직렬화

  5. 5

    Jackson은 Generics를 사용하여 역 직렬화합니다.

  6. 6

    Jackson을 사용하여 여러 유형을 단일 필드로 역 직렬화

  7. 7

    Jackson을 사용하여 Json 파일을 구문 분석 할 때 parseJason 인스턴스를 역 직렬화 할 수 없습니다.

  8. 8

    protobuf-net을 사용하여 유형 변수를 기반으로 클래스를 동적으로 역 직렬화합니다.

  9. 9

    Jackson을 사용하여 혼합 유형의 익명 배열을 역 직렬화하는 방법

  10. 10

    @JsonTypeInfo 및 @JsonSubTypes를 사용하여 JSON을 다형성 개체 모델로 역 직렬화하지 않습니까?

  11. 11

    jackson을 사용하여 동일한 ID를 가진 2 개의 개체를 포함하는 Json을 역 직렬화 할 수 없습니다.

  12. 12

    Jackson 다형성 역 직렬화

  13. 13

    Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

  14. 14

    Jackson은 LocalDateTime을 역 직렬화합니다.

  15. 15

    Jackson을 사용하여 패턴으로 속성 역 직렬화

  16. 16

    Jackson은 주석없이 POJO로 역 직렬화합니다.

  17. 17

    Jersey 기본 구현을 사용한 다형성 유형의 역 직렬화 : MOXy

  18. 18

    XML 역 직렬화는 속성 유형을 확인할 수 없습니다.

  19. 19

    JSON을 다른 필드 유형 jackson을 사용하여 하위 유형으로 언 마샬링

  20. 20

    C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

  21. 21

    Jackson을 사용하여 다중 인수 생성자로 스칼라 객체를 직렬화하는 방법은 무엇입니까?

  22. 22

    현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

  23. 23

    각 키 값에 대해 다른 개체 유형을 사용하여 JSON 파일 역 직렬화

  24. 24

    Haskell / Aeson에서 유형 함수를 사용하여 다형성 값을 어떻게 구문 분석합니까?

  25. 25

    JsonSubTypes없이 jackson을 사용하여 인터페이스를 특정 유형으로 역 직렬화

  26. 26

    Jackson을 사용하여 재귀 적 Map <String, Object>를 역 직렬화 한 후 유형 안전 경고 방지

  27. 27

    C #의 중첩 클래스를 사용하여 JSON을 역 직렬화합니다. 개체의 인스턴스를 만들 위치는?

  28. 28

    Newtonsoft를 사용하여 단일 문자열 또는 jarray 일 수있는 경우 JSON 속성을 역 직렬화합니다.

  29. 29

    DataContractJsonSerializerOperationFormatter는 JSON.NET을 사용하여 역 직렬화하지 않습니다.

뜨겁다태그

보관