2013-11-20 1 views
1

두 개의 속성 ("key"는 문자열)과 "value"는 Java bean으로 직렬화 해제 할 수있는 JSON 객체가 있습니다.잭슨을 사용하여지도에 비 직렬화

{ "key": "foo", "value": "bar" } 

그런 개체의 목록이 주어지면 질문을지도로 역 직렬화 할 수 있습니까? 현재-데이터 바인딩 잭슨을 사용

[{"key": "foo1", "value": "bar1"}, {"key": "foo2", "value": "bar2"}] -> Map<String, String> 

2.1

+0

질문에 대한 충분한 답변을주십시오. 문제가 어디입니까? 당신이하려는 것을 볼 수는 없습니다. – Lion

+0

기본적으로 데이터의 속성 목록/XML 배열을 "key"및 "value"용어가 제거 된 간단한 형식으로 변환하여'{ "foo1": "bar1", "foo2" : "bar2", ...}'. 이것은 외부 배열을 통해 간단한 루프를 사용하여 수행 할 수 있지만 Objective-C에서는 다른 "영리한"(필연적으로 더 효율적이거나 효율적인 것은 아님) 방법을 보았습니다. 당신이 정신적 인 자극을 얻지 못한다면, 나는 단순한 루프를 제안 할 것입니다. (명확하지 않은 경우 잭슨 등을 사용하여지도 목록으로 변환 한 다음 목록을 반복하여 새지도를 작성하십시오.) –

답변

4

쉽게 List<Map<String, String>>에 JSON 이상으로 변환 할 수 있습니다

import java.util.List; 
import java.util.Map; 

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.type.CollectionType; 

public class JacksonProgram { 

    public static void main(String[] args) throws Exception { 
     ObjectMapper mapper = new ObjectMapper(); 
     CollectionType mapCollectionType = mapper.getTypeFactory().constructCollectionType(List.class, Map.class); 
     List<Map<String, String>> result = mapper.readValue(json, mapCollectionType); 
     System.out.println(result); 
    } 
} 

프로그램의 인쇄 위 :

[{key=foo1, value=bar1}, {key=foo2, value=bar2}] 
+3

원하는 것은 아닙니다. –

1

하면 구조가 일치하지 않기 때문에 두 가지 기본 옵션이 있습니다.

  1. 를 사용하여 두 단계 처리 : 중간 표현으로 바인딩 잭슨을 사용하는 않는 경기 (JsonNode 또는 List<Map<String,Object>> 될 수있는) 한 다음 간단한 코드
  2. 쓰기 사용자 정의 직렬 및/또는 병렬 변환기로 원하는 형식으로 변환을 수행

잭슨 광범위한 구조적 변형을 지원하지 않는다 (이 @JsonUnwrapped 같은 간단한 것들) 때문에 이러한 종류의 기능은 데이터 바인딩 모듈에 추가 될 가능성이있다. 이러한 "스마트 맵"유형의 구조가 일반적으로 사용되는 경우 확장 모듈로 추가 될 수 있지만 (불행히도)