Джексон JSON неправильно форматирует

#java #json #jackson

#json #джексон

Вопрос:

У меня есть данные, которые выглядят следующим образом:

 {
    "status": "success",
    "data": {
        "irrelevant": {
            "serialNumber": "XYZ",
            "version": "4.6"
        },
        "data": {
            "lib": {
                "files": [
                    "data1",
                    "data2",
                    "data3",
                    "data4" 
                ],
                "another file": [
                    "file.jar",
                    "lib.jar" 
                ],
                "dirs": []
            },
            "jvm": {
                "maxHeap": 10,
                "maxPermSize": "12"
            },
            "serverId": "134",
            "version": "2.3"
        }
    }
}
  

Вот функция, которую я использую для улучшения данных JSON:

 public static String stringify(Object o, int space) {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(o);
    } catch (Exception e) {
        return null;
    }
}
  

Я использую процессор Jackson JSON для форматирования данных JSON в строку.
По какой-то причине формат JSON находится не в том формате, который мне нужен. При передаче данных в эту функцию я получаю следующий формат:

 {
    "status": "success",
    "data": {
        "irrelevant": {
            "serialNumber": "XYZ",
            "version": "4.6"
        },
        "another data": {
            "lib": {
                "files": [ "data1", "data2", "data3", "data4" ],
                "another file": [ "file.jar", "lib.jar" ],
                "dirs": []
            },
            "jvm": {
                "maxHeap": 10,
                "maxPermSize": "12"
            },
            "serverId": "134",
            "version": "2.3"
        }
    }
}
  

Как вы можете видеть под объектом «другие данные», массивы отображаются как одна целая строка вместо новой строки для каждого элемента в массиве. Я не уверен, как изменить мою функцию stringify, чтобы она правильно форматировала данные JSON.

Ответ №1:

Вы должны проверить, как DefaultPrettyPrinter выглядит. Действительно интересным в этом классе является свойство _arrayIndenter. Значением по умолчанию для этого свойства является класс FixedSpaceIndenter. Вы должны изменить его с помощью класса Lf2SpacesIndenter.

Ваш метод должен выглядеть следующим образом:

 public static String stringify(Object o) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
        printer.indentArraysWith(new Lf2SpacesIndenter());
        return mapper.writer(printer).writeValueAsString(o);
    } catch (Exception e) {
        return null;
    }
}
  

Ответ №2:

У меня недостаточно репутации, чтобы добавить комментарий, но ссылаясь на приведенный выше ответ
Lf2SpacesIndenter удалено из более нового API Jackson (2.7 и выше), поэтому вместо этого используйте:

 printer.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);
  

Источник решения