Список HashMap в строку JSON с новой строкой в ​​Java - PullRequest
0 голосов
/ 23 октября 2019

Мне нужно преобразовать список в строку jsons с новой строкой.

Прямо сейчас код, который я использую, преобразует список HashMap в одну строку jsons. как показано ниже:

List<HashMap> mapList= new ArrayList<>();
HashMap hashmap = new HashMap();
hashmap.add("name","SO");
hashmap.add("rollNo","1");
mapList.put(hashmap);

HashMap hashmap1 = new HashMap();
hashmap1.add("name","SO1");
hashmap1.add("rollNo","2");
mapList.put(hashmap1 );

Теперь я конвертирую ее в строку jsons с помощью ObjectMapper, и результат будет

ObjectMapper mapper = new ObjectMapper();
String output = mapper.writeValueAsString(mapList);

Вывод:

[{"name":"SO","rollNo":1},{"name":"SO1","rollNo":2}]

Работает нормальноно мне нужен вывод в формате, показанном ниже, т.е. для каждой HashMap должна быть новая строка в строке JSON.

[{"name":"SO","rollNo":1},
{"name":"SO1","rollNo":2}]

Ответы [ 3 ]

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

Вы можете использовать методы String, чтобы изменить / заменить строку вывода. Однако это не правильно для строк json, так как они могут содержать запятые или другие символы, которые вы должны экранировать в методах замены String.

В качестве альтернативы вам следует проанализировать строку Json и использовать JsonNode в Json, как показано ниже:

    ObjectMapper mapper = new ObjectMapper();
    String output = mapper.writeValueAsString(mapList);

    JsonNode jsonNode = mapper.readTree(output);
    Iterator<JsonNode> iter=jsonNode.iterator();
     String result = "[";
    while(iter.hasNext()){
        result+=iter.next().toString() + ",\n";
    }
    result =result.substring(0,result.length()-2) + "]";
    System.out.println(result);

Результат:

[{"rollNo":"1","name":"SO"},
{"rollNo":"2","name":"SO1"}]

Этот подход будет работать для строк, содержащих символы, такие как запятая, например, рассмотрим ввод hashmap.put("n,,,ame","SO");

Результат:

[{"n,,,ame":"SO","rollNo":"1"},
{"rollNo":"2","name":"SO1"}]

Обновление: выходные данные обновлены и теперь включают [и] и запятые между строками. Обновление: исправлен вывод соответственно

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

Я предлагаю немного другой путь, то есть используйте собственный сериализатор, как указано здесь .

Это сводится к тому, чтобы иметь свой собственный

public static class MgetSerializer extends JsonSerializer<Mget> {

Который работает, например, для List.

Дело в том, что я бы не стал «смешивать» вещи, как: имея решение, в котором ваш код записывает часть вывода, а Джексон создает прочее частей на выходе. Вместо этого позвольте Джексону делать именно то, что вы хотите.

Помимо этого, я считаю, что весь подход немного сомнительный. Строки JSON не заботятся о новых строках. Так что, если вам интересно, как все отформатировано, лучше посмотрите на инструменты, которые вы используете, чтобы посмотрел на ваш JSON.

Значение: зачем тратить свое время на форматирование строки, которая не означала бы для непосредственного потребления человеком в первую очередь? Консоли браузера покажут вам строки JSON в сложенном виде, и любой приличный редактор имеет подобные возможности в наши дни.

Другими словами: я думаю, вы вкладываете свою энергию не в то место. JSON - это транспортный формат, и вам следует беспокоиться только о контенте , который вы хотите передать, а не в (по сути, бессмысленные эффекты форматирования).

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

Если я четко понимаю вопрос, вы можете использовать:

output.replaceAll(",",",\n");

или вы можете пройти через каждый HashMap.Entry и позвонить

mapper.writeValueAsString(entry);

или использовать конфигурацию

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...