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

플라이

JSON 파일의 내용에 따라 슈퍼 클래스 나 서브 클래스로 역 직렬화하고 싶습니다.

다음과 같은 경우 수퍼 클래스로 역 직렬화되어야합니다.

{
   "id":"123",
   "title":"my title",
   "body":"my body"
}

또는 다음과 같은 경우 하위 클래스에 :

{
   "id":"123",
   "title":"my title",
   "body":"my body",
   "tags":["tag1", "tag2"]
}

따라서 유일한 차이점은 tags배열이며 문자열 배열로 역 직렬화되어야합니다. 그러나 POST 요청을 통해 Jersey (Dropwizard)에서 deserialization을 트리거하면 {"code":400,"message":"Unable to process JSON"}.

이것은 수퍼 클래스입니다.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({ @JsonSubTypes.Type(name = "subdocument", value = SubDocument.class) })
public class SuperDocument {

private String id;
private String title;
private String body;

public SuperDocument() {

}

@JsonCreator
public SuperDocument(@JsonProperty("id") String id, @JsonProperty("title") String title, @JsonProperty("body") String body) {
    this.id = id;
    this.title = title;
    this.body = body;
}

@JsonProperty("id")
public String getId() {
    return id;
}

@JsonProperty("id")
public void setId(String id) {
    this.id = id;
}

... the other getters and setters ...
}

이것은 하위 클래스입니다.

@JsonTypeName("subdocument")
public class SubDocument extends SuperDocument {

private String[] tags;

public SubDocument() {

}

@JsonCreator
public SubDocument(@JsonProperty("id") String id, @JsonProperty("title") String title, @JsonProperty("body") String body, @JsonProperty("tags") String[] tags) {
    super(id, title, body);
    this.tags = tags;
}

@JsonProperty("tags")
public String[] getTags() {
    return tags;
}

@JsonProperty("tags")
public void setTags(String[] tags) {
    this.tags = tags;
}
}

내가 뭘 잘못하고 있는지 알아?

저스틴 호세

JsonTypeInfo하위 클래스 / 슈퍼 클래스를 식별 할 수있는 속성이 필요합니다. 예 :

{
   "id":"123",
   "title":"my title",
   "body":"my body",
   "type":"superdocument"
}

{
   "id":"123",
   "title":"my title",
   "body":"my body",
   "tags":["tag1", "tag2"],
   "type":"subdocument"
}

그런 다음 아래와 같이 SuperDocument 주석을 수정합니다.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,property="type")
@JsonSubTypes({ @JsonSubTypes.Type(name = "subdocument", value = SubDocument.class),@JsonSubTypes.Type(name = "superdocument", value = SuperDocument.class) })

public class SuperDocument {

}

추가 속성 "type"을 유도하지 않으려면 사용자 지정 형식 확인자를 작성하고 아래와 같이 deserializer를 입력해야 할 수 있습니다.

    public class DocumentTypeResolver extends StdTypeResolverBuilder {
    @Override
    public TypeDeserializer buildTypeDeserializer(
            final DeserializationConfig config, final JavaType baseType, final Collection<NamedType> subtypes) {
        return new DocumentDeserializer(baseType, null,
                _typeProperty, _typeIdVisible, _defaultImpl);
    }
}

커스텀 타입

    public static class DocumentDeserializer extends AsPropertyTypeDeserializer {

    public DocumentDeserializer(final JavaType bt, final TypeIdResolver idRes, final String typePropertyName, final boolean typeIdVisible, final Class<?> defaultImpl) {
        super(bt, idRes, typePropertyName, typeIdVisible, defaultImpl);
    }

    public DocumentDeserializer(final AsPropertyTypeDeserializer src, final BeanProperty property) {
        super(src, property);
    }

    @Override
    public TypeDeserializer forProperty(final BeanProperty prop) {
        return (prop == _property) ? this : new DocumentDeserializer(this, prop);
    }

    @Override
    public Object deserializeTypedFromObject(final JsonParser jp, final DeserializationContext ctxt) throws IOException {
        JsonNode node = jp.readValueAsTree();
        Class<?> subType =null;
        JsonNode tags = node.get("tags");
        if (tags == null) {
             subType=SuperDocument.class;
        } else {
            subType=SubDocument.class;
        }
        JavaType type = SimpleType.construct(subType);
        JsonParser jsonParser = new TreeTraversingParser(node, jp.getCodec());
        if (jsonParser.getCurrentToken() == null) {
            jsonParser.nextToken();
        }

        JsonDeserializer<Object> deser = ctxt.findContextualValueDeserializer(type, _property);
        return deser.deserialize(jsonParser, ctxt);

    }

}

이제 SuperDocument아래와 같이 수업에 주석을 답니다.

@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
@JsonTypeResolver(DocumentTypeResolver.class)
public class SuperDocument {

}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

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

분류에서Dev

Jackson을 사용하여 임의의 JSON 역 직렬화

분류에서Dev

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

분류에서Dev

Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

분류에서Dev

잘못된 JSON을 사용한 Spring MVC JSON 역 직렬화 (Jackson)

분류에서Dev

Newtonsoft.Json을 사용한 열거 형 역 직렬화

분류에서Dev

포함 된 형식을 사용한 역 직렬화 JSON

분류에서Dev

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

분류에서Dev

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

분류에서Dev

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

분류에서Dev

C #에서 복잡한 json 파일을 역 직렬화하려고합니다.

분류에서Dev

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

분류에서Dev

Json.NET은 사용자 정의 getter 및 변경 불가능한 유형으로 속성을 역 직렬화하지 않습니다.

분류에서Dev

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

분류에서Dev

Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

분류에서Dev

JSON 역 직렬화에 Scala Jackson을 사용하십니까?

분류에서Dev

Json.net JSON 파일을 C # 사전 유형으로 직접 역 직렬화 하시겠습니까?

분류에서Dev

내 목록에는 직원의 JSON을 역 직렬화 한 후 단일 null 직원이 있습니다.

분류에서Dev

spray-json을 사용한 Scala 케이스 객체의 JSON 역 직렬화

분류에서Dev

GSON 또는 Jackson을 사용하여 일반 인수를 사용하여 JSON을 클래스로 역 직렬화

분류에서Dev

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

분류에서Dev

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

분류에서Dev

GSON을 사용하여 객체의 JSON 배열 역 직렬화

분류에서Dev

Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

분류에서Dev

Jackson 다형성 역 직렬화

분류에서Dev

Gson을 사용하여 로컬 json 파일을 역 직렬화하는 Kotlin

분류에서Dev

json 배열과 일반 속성을 jackson의 pojo로 역 직렬화하는 방법. 어레이 만 작동

분류에서Dev

Json 파일 역 직렬화

분류에서Dev

JSON 파일 역 직렬화

Related 관련 기사

  1. 1

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

  2. 2

    Jackson을 사용하여 임의의 JSON 역 직렬화

  3. 3

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

  4. 4

    Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

  5. 5

    잘못된 JSON을 사용한 Spring MVC JSON 역 직렬화 (Jackson)

  6. 6

    Newtonsoft.Json을 사용한 열거 형 역 직렬화

  7. 7

    포함 된 형식을 사용한 역 직렬화 JSON

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    C #에서 복잡한 json 파일을 역 직렬화하려고합니다.

  12. 12

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

  13. 13

    Json.NET은 사용자 정의 getter 및 변경 불가능한 유형으로 속성을 역 직렬화하지 않습니다.

  14. 14

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

  15. 15

    Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

  16. 16

    JSON 역 직렬화에 Scala Jackson을 사용하십니까?

  17. 17

    Json.net JSON 파일을 C # 사전 유형으로 직접 역 직렬화 하시겠습니까?

  18. 18

    내 목록에는 직원의 JSON을 역 직렬화 한 후 단일 null 직원이 있습니다.

  19. 19

    spray-json을 사용한 Scala 케이스 객체의 JSON 역 직렬화

  20. 20

    GSON 또는 Jackson을 사용하여 일반 인수를 사용하여 JSON을 클래스로 역 직렬화

  21. 21

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

  22. 22

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

  23. 23

    GSON을 사용하여 객체의 JSON 배열 역 직렬화

  24. 24

    Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

  25. 25

    Jackson 다형성 역 직렬화

  26. 26

    Gson을 사용하여 로컬 json 파일을 역 직렬화하는 Kotlin

  27. 27

    json 배열과 일반 속성을 jackson의 pojo로 역 직렬화하는 방법. 어레이 만 작동

  28. 28

    Json 파일 역 직렬화

  29. 29

    JSON 파일 역 직렬화

뜨겁다태그

보관