2017-09-26 2 views
0

나는 이제는 알아낼 수있는 길을 걷고있는 간단한 문제가 있습니다. 이 속으로특정 속성에 대한 목록 비 직렬화

[ 
    { "a": "a", "b": 1 } 
    { "a": "b", "b": 2 } 
] 

:

나는이 직렬화하는

@Data 
public class MyObject { 
    private List<BaseType> rootList; 
} 

내가 이전에 단지 ArrayList를 확장했기 때문에 내가 이렇게 할 이유는하지만 지금은 실제로 진짜 클래스가 필요 상속 할 필요가있어서 더 이상 그렇게 할 수 없습니다. 나는 기본적으로 Jackson이 클래스를 감싸는 대신에 그 안쪽 속성을 채울 필요가 있습니다.

주석이 있습니까?

감사합니다.

+0

추가 baseType 여기서 클래스 코드 –

답변

1

나는 귀하의 질문에 맞으면, 모든 json 배열 항목을 포함하는 배열 필드가있는 객체에 json 배열을 비 직렬화하고자합니다. 당신이 할 수있는 한가지는 커스텀 생성자를 생성하고 그것을 @JsonCreator으로 주석하는 것이다. serialization의 경우 rootList List 필드 위에 @JsonValue을 사용할 수 있습니다.

private static String json = "[{\"a\":\"a\",\"b\":1},{\"a\":\"b\",\"b\":2}]"; 
@Data 
public static class MyObject { 
    @JsonValue // used during serialization 
    private List<BaseType> rootList; 
    @JsonCreator //used during deserialization 
    public MyObject(List<BaseType> items) { 
     this.rootList = items; 
    } 
} 

@Data 
public static class BaseType { 
    @JsonProperty 
    private String a; 
    @JsonProperty 
    private int b; 
} 

public static void main(String[] args) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    MyObject value = mapper.readValue(json, MyObject.class); 
    System.out.println(value); 
    System.out.println(mapper.writeValueAsString(value)); 
} 
+0

는 다른 @JsonCreator으로 새 생성자를 만드는 것보다 할 수있는 다른 방법이 없다? 이것은 꽤 좋은 해결책이지만, 기본적으로 정확하게 원했던 것입니다. 올바르게 직렬화 할 것인지 테스트 해 보았습니까? 나는 지금 그것을 시험하려고하고있다. –

+0

이 답변은 다소 지연 되었기 때문에 사용자 지정 주석이있는 필드에 이와 같은 루트 목록을 deserialize하는 사용자 지정 병렬 변환기를 만들었습니다. 그런 다음 @JsonDeserializer (= MyCustomDeserializer.class 사용)로 @JacksonInside를 사용하여 사용자 정의 주석을 만들었습니다. 기본 잭슨 주석이 포함 된 솔루션이 마음에 들기는하지만 디시리얼라이저의 가장자리 케이스에 대해 걱정할 필요가 없습니다. –

+0

@A.Bello는 얼마간 떨어져 있었기 때문에 지연에 대해 유감스럽게 생각합니다. 그래, 네가 기대했던 것처럼 일해야 해. '@ JsonDeserializer'는 POJO가 3-D 파티 라이브러리의 일부일 때처럼 mixin으로'@ JsonDeserializer'를 사용할 수있는 것처럼 POJO 코드를 변경할 수 없다면 특히 좋은 옵션입니다. 그러나이 방법을 사용할 수는 없습니다. 그리고 네, 사용자 정의 생성자 위의 @JsonCreator가 필요하거나 2-nd 옵션은 정적 팩토리 함수를 사용하는 것입니다. [Here is more info] (http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html) – varren