2013-08-21 7 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 
] 

Это то, что у меня есть для объекта к карте, но я хочу, чтобы отобразить с помощью клавиши автоматически строит HashMap или словарь withough того, чтобы перебирать думал список.

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

class mainMapper { 
    List<keyValPairObject> theKeyValPairValues; 
} 

Я хотел бы сохранить его в объекте, где я могу получить к нему доступ нравится:

theKeyValPairValues["values1"].values; 
+0

Так почему бы вам просто не использовать объект HashMap для начала? Затем вы можете установить каждую клавишу в строку и каждое значение в список. Синтаксис будет немного отличаться от того, что вы указали: map.get ("values1"); Это вернет список значений для ключа «values1». – UpAllNight

+0

Как я могу автоматически сопоставить его с объектом hashmap за Джексон или это будет ручной процесс, повторяющий каждый список json, а затем построение hashmap? – JaJ

+0

@UpAllNight: Thx для ответа, так что мне нужно вручную создать хэш-карту или будет ли Джексон отображать ее автоматически для меня? Не знаю, как я мог это сделать. – JaJ

ответ

1

Может быть, вы должны использовать "Дерево моделей", так что:

JsonNode root = mapper.readTree(jsonSource); 

а затем вы можете перемещать значения с помощью методов «get()» и «path()». path() приятно, так как вы можете пропустить любые нулевые проверки (если узел не существует, включен виртуальный «отсутствующий» узел, поэтому вы можете свободно связывать вызовы).

Таким образом, вы могли бы сделать так:

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

, чтобы получить эту 10.5 значение из вашей структуры.

Бит больше информации можно найти от this entry и от «Tree Model» от файла проекта databind.

+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