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

Aioobe

다음과 같은 클래스 계층 구조가 있습니다.

interface MyEntity {
    ...
}

class MyEntityRef {
    String id;
    ...
}

class MyEntityImpl {
    String id;
    String name;
    ...
}

의 인스턴스를 MyEntityRef일반 문자열로 직렬화하고 싶습니다 .

"someEntityId"

MyEntityImpl일반 개체의 인스턴스 :

{
    id: "someEntityId",
    name: "someName"
}

그리고 그 반대의 경우 : a를 역 직렬화 할 때 json이 일반 문자열 인 경우 a로, 일반 json 객체 인 경우 MyEntitya로 역 직렬화되기를 원합니다 .MyEntityRefMyEntityImpl

내 실제 코드에는 여러 유형의 엔티티 (예 : 다중 X/ XRef/ XImpl트리플)가 있습니다. 이러한 모든 항목을 나열하지 않으려 고 인터페이스에 다음과 같이 주석을 달았습니다.

@MyEntityAnnotation(ref=MyEntityRef.class, impl=MyEntityImpl.class)
interface MyEntity {
    ...
}

이 주석 정보를 기반으로하는 모든 엔티티에 대해 위에서 설명한 직렬화 / 역 직렬화를 해결하는 방법을 알아내는 사람에게 추가 포인트가 주어집니다.


내가 시도한 것 : 내가 생각할 수있는 모든 것 ( SimpleDeserializers/ SimpleSerializers, BeanDeserializerModifier/ BeanSerializerModifier, TypeSerializer/ TypeDeserializer)

알렉세이 가브리 로프

이것은 기술적으로 커스텀 디시리얼라이저 (아래 참조)를 사용하여 가능하지만 리플렉션 및 유형이 안전하지 않은 변환을 사용하면 매우 복잡하고 약간 어색해 보입니다. 양방향 참조를 사용하면 더 나은 운을 얻을 수 있지만 모델을 변경해야 할 수도 있습니다.

다음은 사용자 지정 deserializer를 기반으로 한 예입니다.

public class JacksonEntity {

    @Retention(RetentionPolicy.RUNTIME)
    static public @interface MyAnnotation {
        Class<?> ref();
        Class<?> impl();
    }

    @MyAnnotation(ref = MyEntityRef.class, impl = MyEntityImpl.class)
    static public interface MyEntity {
    }

    static public class MyEntityRef implements MyEntity {
        private final String id;

        public MyEntityRef(String id) {
            this.id = id;
        }

        @JsonValue
        public String getId() {
            return id;
        }

        @Override
        public String toString() {
            return "MyEntityRef{" +
                    "id='" + id + '\'' +
                    '}';
        }
    }

    static public class MyEntityImpl implements MyEntity {
        public final String id;
        public final String name;

        @JsonCreator
        public MyEntityImpl(@JsonProperty("id") String id, @JsonProperty("name") String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "MyEntityImpl{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    static public class MyDeserializer extends JsonDeserializer<Object> {
        private final Class<?> refType;
        private final Class<?> implType;

        public MyDeserializer(MyAnnotation annotation) {
            this.refType = annotation.ref();
            this.implType = annotation.impl();
        }

        @Override
        public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
            JsonToken jsonToken = jp.getCurrentToken();
            if (jsonToken == JsonToken.START_OBJECT) {
                return jp.readValueAs(implType);
            } else if (jsonToken == JsonToken.VALUE_STRING) {
                try {
                    return refType.getConstructor(String.class).newInstance(jp.getValueAsString());
                } catch (Exception e) {
                    throw new UnsupportedOperationException();
                }
            }
            return null;
        }
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.setDeserializerModifier(new BeanDeserializerModifier() {
            @Override
            public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
                                                          BeanDescription beanDesc,
                                                          JsonDeserializer<?> deserializer) {
                MyAnnotation myAnnotation = beanDesc.getClassAnnotations().get(MyAnnotation.class);
                // it must be interface, otherwise getting meeting recursion
                if (myAnnotation != null && beanDesc.getBeanClass().isInterface()) {
                    return new MyDeserializer(myAnnotation);
                }
                return super.modifyDeserializer(config, beanDesc, deserializer);
            }
        });
        mapper.registerModule(module);

        MyEntityRef ref = new MyEntityRef("id1");
        MyEntityImpl impl = new MyEntityImpl("id2", "value");

        String jsonRef = mapper.writeValueAsString(ref);
        System.out.println(jsonRef);
        String jsonImpl = mapper.writeValueAsString(impl);
        System.out.println(jsonImpl);

        System.out.println(mapper.readValue(jsonRef, MyEntity.class));
        System.out.println(mapper.readValue(jsonImpl, MyEntity.class));
    }
}

산출:

"id1"
{"id":"id2","name":"value"}
MyEntityRef{id='id1'}
MyEntityImpl{id='id2', name='value'}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

System.Text.Json 사용자 지정 직렬화 / 역 직렬화

분류에서Dev

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

분류에서Dev

System.Text.Json을 사용한 사용자 지정 역 직렬화

분류에서Dev

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

분류에서Dev

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

분류에서Dev

Jackson의 사용자 지정 JSON 역 직렬화, invalide 배열 제외

분류에서Dev

Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

분류에서Dev

Django 사용자 지정 역 직렬화

분류에서Dev

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

분류에서Dev

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

분류에서Dev

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

분류에서Dev

JsonConverter를 사용한 C #의 사용자 지정 JSON 역 직렬화

분류에서Dev

NSJSONSerialization을 사용하여 json에서 이미지 역 직렬화

분류에서Dev

특정 필드가있는 경우에만 사용자 지정 JSON 역 직렬화 (Jackson 사용)

분류에서Dev

사용자 지정 XmlSerialization을 사용하여 복잡한 개체 역 직렬화

분류에서Dev

여러 가능한 형식으로 속성을 읽기위한 사용자 지정 JSON 직렬화 / 역 직렬화

분류에서Dev

잭슨 사용자 정의 직렬화 및 역 직렬화

분류에서Dev

JSON.NET을 사용하여 dictionary <string, object> 역 직렬화 및 직렬화

분류에서Dev

Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

분류에서Dev

Jackson JSON을 사용하여 비대칭 직렬화 및 역 직렬화가 가능합니까?

분류에서Dev

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

분류에서Dev

리플렉션을 사용한 JSON 역 직렬화

분류에서Dev

리플렉션을 사용한 JSON 역 직렬화

분류에서Dev

C #을 사용한 조건부 JSON 역 직렬화

분류에서Dev

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

분류에서Dev

자바 객체에 datetime을 사용하여 JSON 역 직렬화

분류에서Dev

Objective-C를 사용하여 JSON을 사용자 지정 개체로 역 직렬화

분류에서Dev

SignalR이 사용자 지정 DataMember 이름을 직렬화 / 역 직렬화하지 않습니다.

분류에서Dev

사용자 지정 목록을 JSON C #으로 직렬화

Related 관련 기사

  1. 1

    System.Text.Json 사용자 지정 직렬화 / 역 직렬화

  2. 2

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

  3. 3

    System.Text.Json을 사용한 사용자 지정 역 직렬화

  4. 4

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

  5. 5

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

  6. 6

    Jackson의 사용자 지정 JSON 역 직렬화, invalide 배열 제외

  7. 7

    Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

  8. 8

    Django 사용자 지정 역 직렬화

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

    JsonConverter를 사용한 C #의 사용자 지정 JSON 역 직렬화

  13. 13

    NSJSONSerialization을 사용하여 json에서 이미지 역 직렬화

  14. 14

    특정 필드가있는 경우에만 사용자 지정 JSON 역 직렬화 (Jackson 사용)

  15. 15

    사용자 지정 XmlSerialization을 사용하여 복잡한 개체 역 직렬화

  16. 16

    여러 가능한 형식으로 속성을 읽기위한 사용자 지정 JSON 직렬화 / 역 직렬화

  17. 17

    잭슨 사용자 정의 직렬화 및 역 직렬화

  18. 18

    JSON.NET을 사용하여 dictionary <string, object> 역 직렬화 및 직렬화

  19. 19

    Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

  20. 20

    Jackson JSON을 사용하여 비대칭 직렬화 및 역 직렬화가 가능합니까?

  21. 21

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

  22. 22

    리플렉션을 사용한 JSON 역 직렬화

  23. 23

    리플렉션을 사용한 JSON 역 직렬화

  24. 24

    C #을 사용한 조건부 JSON 역 직렬화

  25. 25

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

  26. 26

    자바 객체에 datetime을 사용하여 JSON 역 직렬화

  27. 27

    Objective-C를 사용하여 JSON을 사용자 지정 개체로 역 직렬화

  28. 28

    SignalR이 사용자 지정 DataMember 이름을 직렬화 / 역 직렬화하지 않습니다.

  29. 29

    사용자 지정 목록을 JSON C #으로 직렬화

뜨겁다태그

보관