2012-03-21 5 views
3

메시지를 검사하지 않고 사용할 POJO 유형을 정확히 모르는 경우 Jackson을 사용하여 JSON 문서를 POJO로 어떻게 비 직렬화할까요? 잭슨과 POJO를 등록하여 메시지를 기반으로 POJO를 선택할 수있는 방법이 있습니까?Jackson을 사용하여 JSON에서 POJO로 메시지 직렬화 해제

내가 해결하려고하는 시나리오는 유선을 통해 JSON 메시지를 받고 메시지 내용을 기반으로 여러 POJO 중 하나에 deserialize하는 것입니다.

답변

2

설명하는 메커니즘을 알지 못합니다. 난 당신이 JSON을 직접 검사해야합니다 생각 :

Map<String, Class<?>> myTypes = ... 
    String json = ... 
    JsonNode node = mapper.readTree(json); 
    String type = node.get("type").getTextValue(); 
    Object myobject = mapper.readValue(json, myTypes.get(type)); 

는 타입 필드가없는 경우이 유형을 해결하기 위해 JsonNode의 필드를 검사해야합니다.

+0

의 내용을 주어진 특정 POJO로 역 직렬화하는 클래스를 사용하는 방법을 정말 분명하지 않다. 나는 그 반응에 감사한다. – Josh

+1

추가 제안 사항 : "Object myObject = mapper.treeAsValue (node, type);"를 사용하여 트리 ('JsonNode')에서 POJO로 직접 변환 할 수도 있습니다. 이것은 더 효율적 일뿐만 아니라 원하는 경우 (노드 추가 또는 제거, 값 변경) 트리를 수정할 수 있습니다. – StaxMan

0

JSON 라이브러리에 융통성이 있다면 Jackson을 살펴보십시오. 이 바로 목적으로 사용할 수있는 BeanDeserializer이 있습니다.

+0

그것은 꽤 좋아 보인다 메시지 .. – Josh

0

Jackson의 BeanDeserializer는 더 이상 사용되지 않습니다. 그러나 동일한 문제가있어서 Google의 GSon을 사용하여 해결했습니다. 이 예를 살펴보십시오.

을 감안하여 POJO 데이터 형식 :

class BagOfPrimitives { 
    private int value1 = 1; 
    private String value2 = "abc"; 
    private transient int value3 = 3; 
    BagOfPrimitives() { 
    // no-args constructor 
    } 
} 
  • 직렬화 즉 무한 재귀의 원인이되므로 당신은 순환 참조와 객체를 직렬화 할 수

    BagOfPrimitives obj = new BagOfPrimitives(); 
    Gson gson = new Gson(); 
    String json = gson.toJson(obj); // ==> json is {"value1":1,"value2":"abc"} 
    

참고.

  • 역 직렬화

    BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class); 
    
관련 문제