Как создать указанный конкретный формат JSON

Это формат JSON, который я получаю через API.

Созданный в настоящее время формат JSON

[
  {
    "question":"q1",
    "option":"a"
  },
  {
    "question":"q1",
    "option":"b"
  },
  {
    "question":"q1",
    "option":"c"
  },
  {
    "question":"q1",
    "option":"d"
  },
  {
    "question":"q2",
    "option":"a"
  },
  {
    "question":"q2",
    "option":"b"
  }
]

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

List finalList = new ArrayList();
list.stream.forEach(k - > {
    List optionList = new ArrayList();
    Map m = new HashMap();
    if (!m.containsKey(k.getQuestion)) {
        m.put("ques", k.getQuestion());
    }
    optionList.add(k.getOption());
    m.put("option", optionList);
    finalList.add(m);
})
System.out.println(finalList);

но приведенный выше код не возвращает конкретный предпочтительный формат JSON.

Формат JSON, который я хочу сгенерировать

[
  {
    "question":"q1",
    "option":[
      "a",
      "b",
      "c",
      "d"
    ]
  },
  {
    "question":"q2",
    "option":[
      "a",
      "b"
    ]
  }
]

person Arpit Asati    schedule 12.02.2020    source источник
comment
Вы что-нибудь пробовали? Если да, то не могли бы вы показать нам и объяснить, почему это не работает?   -  person Derlin    schedule 12.02.2020
comment
Десериализовать, нормализовать и снова сериализовать   -  person BWA    schedule 12.02.2020
comment
Вы указали недопустимый формат JSON. Строки должны быть заключены в кавычки.   -  person RealSkeptic    schedule 12.02.2020
comment
@Derlin Я попытался использовать итерацию списка и проверить, доступен ли вопрос на карте в качестве ключа, если нет, то добавьте вопрос и соответствующий параметр, но он не работает   -  person Arpit Asati    schedule 12.02.2020
comment
хорошо, тогда покажи нам код, чтобы мы могли помочь   -  person Derlin    schedule 12.02.2020
comment
Пожалуйста, отредактируйте вопрос (не помещайте код в комментарии). Добавьте использованный код и объясните, что означает неработающий. Выдает ошибку? Если да, включите полную ошибку - отформатированную как код - и укажите, в какой строке она происходит. Если нет, работает ли она некорректно? Объясните, что именно он делает, чего не должен был делать.   -  person RealSkeptic    schedule 12.02.2020
comment
@Derlin Я изменил свой вопрос кодом, который я пробовал сам, пожалуйста, помогите.   -  person Arpit Asati    schedule 12.02.2020
comment
@Derlin Теперь вы понимаете мой код? Если да, то попробуйте ответить.   -  person Arpit Asati    schedule 12.02.2020


Ответы (1)


  1. Вы можете создавать java pojos для обеих структур JSON. pojo для исходной структуры:
class SourceData {
    private String question;
    private String option;
    // getters and setters
}
  1. Целевое изображение JSON:
class TargetData {
    private String question;
    private List<String> options;
    // getters and setters
}
  1. Сериализовать исходный код json в pojos
List<SourceData> sourceDatas = new ObjectMapper().readValue(jsonString, new TypeReference<List<SourceData>>() {});
  1. Переход через исходные объекты pojo и преобразование в целевые pojo
List<TargetData> targetDatas = new ArrayList<>();

sourceDatas.stream().collect(Collectors.groupingBy(item -> item.getQuestion()))
    .forEach((question, itemList) -> {
        TargetData targetData = new TargetData();
        targetData.setQuestion(question);
        List<String> options = itemList.stream().map(SourceData::getOption).collect(Collectors.toList());
        targetData.setOptions(options);
        targetDatas.add(targetData);
    });
person Smile    schedule 13.02.2020