2013-08-21 2 views
1

어떻게 다음 json 페이로드를 검색과 같은보다 친숙한 사전에 매핑 할 수 있습니까? 돌아 오는 데이터가 목록의 일반적인 키 값으로 돌아옵니다. 그러나 모든 것을 목록으로 저장하는 대신 키로 사전 조회로 모든 것을 액세스 할 수 있기를 원합니다.Json jackson mapping ask

[ 
    { 
     "key":"value1", 
     "values":[ 
     10.5 
     ] 
    }, 
    { 
     "key":"value2", 
     "values":[ 
     20.5 
     ] 
    } 
    o o o more values here... o o o 
] 

이 내가지도하는 개체에 대해 무엇을 가지고 있지만 키를 자동으로 반복 할 필요 절차없이 해시 맵 또는 사전을 구축하기로 매핑 할 목록을 생각했다.

class keyValPairObject { 
    private String key; 
    private List<?> values; 
} 

class mainMapper { 
    List<keyValPairObject> theKeyValPairValues; 
} 
내가 그것을 좋아 액세스 할 수있는 객체에 저장하고 싶습니다

:

JsonNode root = mapper.readTree(jsonSource); 

: 아마도

theKeyValPairValues["values1"].values; 
+0

그렇다면 먼저 HashMap 개체를 사용하여 시작하지 않으시겠습니까? 그런 다음 각 키를 String으로 설정하고 각 값을 List로 설정할 수 있습니다. 구문은 당신이 말한 것과 약간 다를 것이다 : map.get ("values1"); 그러면 키 "values1"에 대한 값 목록이 반환됩니다. – UpAllNight

+0

어떻게 잭슨 당 자동으로 hashmap 객체에 맵핑 할 수 있습니까? 아니면 수동 프로세스로 각 json 목록을 반복 한 다음 해시 맵을 작성합니까? – JaJ

+0

@UpAllNight : Thx 답장을 위해 수동으로 해시 맵을 생성해야합니까, 아니면 잭슨이 자동으로 맵핑할까요? 내가 이것을 어떻게 설정할 수 있을지 모르겠다. – JaJ

답변

1

는 "트리 모델"을 사용한다, 그래서 "get()"및 "path()"메소드를 사용하여 값을 트래버스 할 수 있습니다. path()은 널 검사를 건너 뛸 수 있기 때문에 좋습니다 (노드가 존재하지 않으면 가상 "누락"노드가 포함되므로 호출을 자유롭게 연결할 수 있습니다).

int value = rootNode.path(0).path("value").path(0).asIntValue(); 

이 구조에서 해당 10.5 값을 얻을 : 같은 당신이 할 것

그런 식으로.

비트 자세한 내용은 this entry 및 databind 프로젝트의 추가 정보 "Tree Model"에서 찾을 수 있습니다.

+0

이것은 멋집니다! 나는이 기회를 줄거야! – JaJ

1

좋아요. 도움이 되었기를 바랍니다. 이 반환됩니다

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import org.codehaus.jackson.map.ObjectMapper; 

public String hashmapToJson() { 

    ObjectMapper mapper = new ObjectMapper(); 
    String result = ""; 

    HashMap<String, List<String>> map = new HashMap<String, List<String>>(); 

    String key1 = "values1"; 
    String key2 = "values2"; 
    String key3 = "values3"; 

    List<String> list1 = new ArrayList<String>(); 
    List<String> list2 = new ArrayList<String>(); 
    List<String> list3 = new ArrayList<String>(); 

    for(int i = 0; i < 3; i++){ 
     list1.add("Element" + i); 
     list2.add("Element" + i); 
     list3.add("Element" + i); 
    } 

    map.put(key1, list1); 
    map.put(key2, list2); 
    map.put(key3, list3); 

    try { 
     result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return result; 

} 

:

{ 
"values1":["Element0","Element1","Element2"], 
"values2":["Element0","Element1","Element2"], 
"values3":["Element0","Element1","Element2"] 
} 

이 당신이 찾고 있던 무엇인가 여기에 몇 가지 코드는?

+0

굉장해! 감사! – JaJ