Как десериализовать Json на карту карты? - PullRequest
0 голосов
/ 04 октября 2019

Я хочу десериализовать json в

Map<String, Map<String, String>

Это структура json, которую я хочу преобразовать.

{
     "filetype": {
        "cell": "value"
     },
     "fileType2": {
        "cell2": "value2"}
 }

Я попытался создать класс с типом Map<String, Map<String, String> ипробовал с ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) в Джексоне:

class MapOfMap {
    Map<String, Map<String, String>> mapOfMap;
    //getter and setter
}
objectMapper.readValue(
                new File(this.getClass()
                        .getClassLoader()
                        .getResource("configs/sample.json").getFile()),
                MapOfMap.class
        )

Я получаю эту ошибку:

Нераспознанное поле "fileType".

Есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Джексон

на карту

    public static HashMap<String,Object> jsonToMap(String json) throws IOException {
        JsonFactory factory = new JsonFactory();
        ObjectMapper mapper = new ObjectMapper(factory);
        TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {};
        return mapper.readValue(json, typeRef);
    }

на объект:

    public static <T> T jsonToObject(String json, Class<T> clazz) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(json, clazz);
    }
0 голосов
/ 04 октября 2019

с использованием gson :

String json = "{\n" +
            "     \"filetype\": {\n" +
            "        \"cell\": \"value\"\n" +
            "     },\n" +
            "     \"fileType2\": {\n" +
            "        \"cell2\": \"value2\"\n" +
            "     }\n" +
            " }";
Gson gson = new GsonBuilder().create();
Map map = gson.fromJson(json, Map.class); //will be a map of maps

обратите внимание, что по умолчанию gson равен LinkedTreeMaps (поэтому порядок итераций элементов сохраняется)

0 голосов
/ 04 октября 2019

Вам не нужно писать класс обтекания вокруг вашей Карты. Просто скажите Mapper, что вы хотите карту:

    String jsonString = "{\n" + 
            "     \"filetype\": {\n" + 
            "        \"cell\": \"value\"\n" + 
            "     },\n" + 
            "     \"fileType2\": {\n" + 
            "        \"cell2\": \"value2\"}\n" + 
            " }";

    Map<String, Map<String, String>> map;
    ObjectMapper mapper = new ObjectMapper();

    try {
        map = mapper.readValue(
            jsonString,
            new TypeReference<Map<String, Map<String, String>>>(){}
        );
        System.out.println(map);
    } catch (Exception e) {
        e.printStackTrace();
    }

Она печатает: {filetype={cell=value}, fileType2={cell2=value2}}, которая выглядит так, как вы хотите.

Для справки: это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...