Как создать указанный формат c JSON - PullRequest
1 голос
/ 12 февраля 2020

Это формат 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);

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

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

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

1 Ответ

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