Java: преобразование json в Map

Не очень понимаю как работать с картами на Java, а решение нужно срочно.

Следующая попытка осуществить задуманное возвращает пустую карту (но не null).

public Map<String, String> parse () {

    try (Reader reader = new FileReader(filepath)) {

        JSONObject jsonObj = new JSONObject(reader);
        @SuppressWarnings("unchecked")
        Map<String, String> map = new Gson().fromJson(jsonObj.toString(), Map.class);

        this.data = map;
        printValues(map);
        return map;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

public static void printValues(Map<String, String> map){
    System.out.println("===============JSON OUT===================");
    for(Map.Entry<String, String> pair : map.entrySet())
    {
        String value = pair.getValue();
        System.out.println(value);
    }
    System.out.println("===============JSON OUT===================");
}

json имеет следующий вид:

{
    "key1" : "value1",
    "key2" : "value2",
    "key3" : "value3",
    "key4" : "value4",
    "key5" : "value5",
    "key6" : "value6"
}

Т.е. это всегда простейший словарь String : String.

Работаю над фреймворком с уже установленными соглашениями по ведению данных, поэтому Map<String, Object> не подходит.

Также изначально количество ключей и их имена не известны.

Подскажите в чем ошибка и как реализовать задуманное. Спасибо!


Ответы (1 шт):

Автор решения: Circassian

Не стал вдаваться в подробности почему, но FileReader в данном случае отрабатывает некорректно. Данные из файла не читаются.

В случае использования FileInputStream и посимвольного считывания данных в строку, всё работает как нужно.

public Map<String, String> parse() {
    StringBuilder jsonObj = new StringBuilder();
    try(FileInputStream fin=new FileInputStream(filepath))
    {
        int i=-1;
        while((i=fin.read())!=-1){
            jsonObj.append((char) i);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    Map<String, String> map = new Gson().fromJson(jsonObj.toString(), Map.class);
    printValues(map);

    return map;

}
→ Ссылка