Конвертировать JSON-запись в LinkedHashMapиспользуя Jackson API - PullRequest
3 голосов
/ 05 ноября 2019

У меня есть файл JSON (он содержит массив объектов JSON.) Я пытаюсь прочитать его объект за объектом. Каждый объект мне нужно преобразовать в LinkedHashMap<String,String>, где ключ и значение являются строками. Обратите внимание, что даже если объекты JSON содержат нестроковое значение (Integer/Boolean), я хочу, чтобы мой LinkedHashMap содержал строку.

Это мой файл JSON (films.json):

[
  {
    "name": "Fight Club",
    "year": 1999,
  }
]

Теперь у этого есть 1 объект. Я хочу преобразовать его в LinkedHashMap<String,String>.

Так что для приведенного выше примера мой LinkedHashMap должен содержать (для 1-го объекта JSON):

"name":"Fight CLub"

"year": "1999"

Обратите внимание, что год равен String в LinkedHashMap, а не Integer.

Это то, что я пробовал.

Map<String, Object> myLinkedHashMap;

JsonParser jsonParser = new JsonFactory().createParser(new File("films.json"));
jsonParser = new JsonFactory().createParser(new File(filePath));
jsonParser.nextToken();

ObjectMapper  mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

while(jsonParser.nextToken() != JsonToken.END_ARRAY){
    myLinkedHashMap  = mapper.readValue(jsonParser, LinkedHashMap.class);
}

Переменная myLinkedHashMap будет содержать пару ключ / значение для объекта в моем файле JSON.

Но проблема в том, чтодля 'года' файла JSON я получаю Integer в LinkedHashMap, поскольку файл JSON также содержит Integer.

Вместо этого я хочу Integer как String в LinkedHashMap.

Пожалуйста, помогите мне получить String в LinkedHashMap вместо Integer.

Примечание. Решение должно быть общим и для других типов данных.

Таким образом, если объект JSON содержит логическое значение true, то мой LinkedHashMap должен содержать "true".

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

Вы можете создать тип карты, используя методы TypeFactory и constructMapType, чтобы точно сказать, что вам нужно от метода readValue. См. Пример ниже:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.util.Assert;

import java.io.File;
import java.util.LinkedHashMap;

public class JsonMapApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        JsonParser jsonParser = mapper.getFactory().createParser(jsonFile);
        jsonParser.nextToken();

        MapType mapType = mapper.getTypeFactory().constructMapType(LinkedHashMap.class, String.class, String.class);
        while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
            LinkedHashMap<String, String> map = mapper.readValue(jsonParser, mapType);
            map.forEach((k, v) -> {
                Assert.isInstanceOf(String.class, v);
                System.out.println(k + " -> " + v + " (" + v.getClass().getName() + ")");
            });
        }
    }
}

Над отпечатками кода:

name -> Fight Club (java.lang.String)
year -> 1999 (java.lang.String)
0 голосов
/ 05 ноября 2019

Изменить

Map<String, Object> myLinkedHashMap;

на

 Map<String, String> myLinkedHashMap;
...