2013-03-15 6 views
23

Jackson을 사용하여 DynamoDB에 일부 데이터를 저장하는 응용 프로그램을 사용하여 복잡한 객체를 JSON으로 마샬링합니다.LinkedHashMap을 복잡한 객체로 캐스팅

예를 들어 내가 정렬 화하고있어 목적은 다음과 같습니다

private int anInteger; 
private SomeOtherObject; 

및 SomeOtherObject는 다음과 같습니다 :

private long aLong; 
private float aFloat; 
SomeObject의는 다음과 같을 수

private String aString; 
private List<SomeObject> someObjectList; 

개체가 아무 문제없이 마샬링되고 JSON 문자열로 DB에 저장되면 좋습니다.

DynamoDB에서 데이터를 검색 할 때 Jackson은 자동으로 JSON을 검색하고이를 다시 변환합니다 ... 'someObjectList'가 List<SomeObject>이 아닌 List<LinkedHashMap>으로 반환되는 것을 제외하고! 이것은 Jackson의 표준 동작입니다.이 현상이 일어나고있는 것은 아닙니다.

이제 문제가 발생합니다. 내 코드베이스는 List<SomeObject>을 처리한다고 생각하지만 실제 처리는 List<LinkedHashMap>입니다! 내 질문은 어떻게 내 'LinkedHashMap 다시'SomeObject '로 얻을 수 있습니다. 분명히 이것은 수동 프로세스이지만 내가 의미하는 바는 값을 추출 할 수 없다는 것입니다.

나는이 할 경우

for (LinkedHashMap lhm : someObjectList) { 
    // Convert the values back 
} 

내가 someObjectList 유형의 것을 말해 컴파일 오류가 'SomeObject의'하지의 LinkedHashMap을.

나는이 할 경우

for (SomeObject lhm : someObjectList) { 
    // Convert the values back 
} 

내가의 LinkedHashMap은 'SomeObject의'에 캐스팅 될 수 없음을 말해 런타임 오류가 발생합니다.

답변

70

ObjectMapper.convertValue()은 값 또는 전체 목록에 대해서도 사용할 수 있습니다. 이것은 당신이했던 것처럼 기능적으로 동일

POJO pojo = mapper.convertValue(singleObject, POJO.class); 
// or: 
List<POJO> pojos = mapper.convertValue(listOfObjects, new TypeReference<List<POJO>>() { }); 

: 그러나 당신이 변환 유형을 알 필요가

byte[] json = mapper.writeValueAsBytes(singleObject); 
POJO pojo = mapper.readValue(json, POJO.class); 

하지만 대신 메모리 이벤트를 사용하여 JSON과 같은 데이터의 실제 직렬화를 방지 시퀀스를 중간 단계로 사용합니다.

+0

그러나 두 번째 예제에서는 POJO 유형에 대한 정적 참조가 필요하지 않습니다. –

+0

@ BoSøborgPetersen 나는 그게 무슨 뜻인지 잘 모르겠다. ... – StaxMan

+0

굉장해. 내가 할 일은 POJO 클래스에 기본 생성자가 포함되어 있는지 확인하는 것입니다 (다른 매개 변수화 된 생성자가있는 경우) – Gnana