Как конвертировать карту > в JsonObject - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь преобразовать карту> в JSON объект. Я пробовал два разных способа конвертации.

  1. Использование ObjectMapper:

Вот код выглядит, но возвращает ноль.

       @GetMapping("/showRawKafkaMetrics")
            public String getMetrics() throws JsonProcessingException {
                StringBuilder sb = new StringBuilder();
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry
                        .getListenerContainers()) {
    // The below map of metrics I'm trying to convert into json Object
                    Map<String, Map<MetricName, ? extends Metric>> metrics = messageListenerContainer.metrics();
                     metrics.forEach((clientid, metricMap) -> {
                        log.info("Client Id:"+sb.toString());
                         String json = null;
                         try {
                             json = objectMapper.writeValueAsString(metricMap);
                         } catch (JsonProcessingException e) {
                             e.printStackTrace();
                         }
                         log.info("JSON Metrics :"+json);
                        metricMap.forEach((metricName, metricValue) -> {
                            log.info("------------ Metric name: " + metricName.name() + " ----------- Metric value: "
                                    + metricValue.metricValue() + LINE_BREAK);
                        });
                    });
                }
                String metrics = sb.toString();
                return metrics;
            }

****2. Using JSON Object 

Here is the code looks like:****
         @GetMapping("/showRawKafkaMetrics")
                    public String getMetrics() throws JsonProcessingException {
                        StringBuilder sb = new StringBuilder();
                        JsonObject jsonObject = new JsonObject();
                        for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry
                                .getListenerContainers()) {
    // The below map of metrics I'm trying to convert into json Object
    // The below map of metrics I'm trying to convert into json Object

                            Map<String, Map<MetricName, ? extends Metric>> metrics = messageListenerContainer.metrics();

                            metrics.forEach((clientid, metricMap) -> {
                                log.info("Client Id:"+sb.toString());
                                metricMap.forEach((metricName, metricValue) -> {
                                    log.info("------------ Metric name: " + metricName.name() + " ----------- Metric value: "
                                            + metricValue.metricValue() + LINE_BREAK);
                                    jsonObject.add(metricName.toString(), (JsonElement) metricValue);
                                    log.info("JSON METRICS:"+jsonObject);
                                });
                            });
                        }
                        String metrics = sb.toString();
                        return metrics;
                    }

В обоих случаях я получаю нулевые указатели. Может кто-нибудь предложить мне лучший способ конвертировать карту метрик в JsonObject. Поэтому в дальнейшем я могу обработать это, чтобы создать панель управления.

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Пусть весна сделает это за вас. Добавьте @ResponseBody и produces = "application/json".

Вопрос о Map<String, Map<MetricName, ? extends Metric>>, который возвращается messageListenerContainer.metrics(), но у вас есть список этих messageListenerContainer объектов, так что вы действительно хотите получить List из них должны быть преобразованы в JSON.

@GetMapping(path = "/showRawKafkaMetrics", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String getMetrics() {
    List<Map<String, Map<MetricName, ? extends Metric>>> list = new ArrayList<>();
    for (MessageListenerContainer container : kafkaListenerEndpointRegistry.getListenerContainers())
        list.add(container.metrics());
    return list;
}
0 голосов
/ 19 апреля 2020

Причина, по которой это не работает и вы получаете null, заключается в том, что вы пытаетесь сериализовать сами классы MetricName и Metric.

Полагаю, в примере с ObjectMapper выбрасывается исключение JsonProcessingException, которое только что напечатано в консоли, поэтому json сохраняется null.

Чтобы это работало быстрее xml ObjectMapper подготовьте свою собственную структуру классов DTO или просто используйте java .util.Map и сериализуйте ее, например, с помощью ObjectMapper#writeValueAsString.

См. Быстрее XML Документы и примеры.

...