> 进入 JsonObject,java,json,jackson,gson,metrics"/>

首页 > 解决方案 > 如何转换地图> 进入 JsonObject

问题描述

我正在尝试将 Map> 转换为 JSON 对象。我尝试了两种不同的转换方式。

  1. 使用对象映射器:

这是代码的样子,但返回 null。

       @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 的最佳方法。因此,我可以进一步处理它以创建仪表板。

标签: javajsonjacksongsonmetrics

解决方案


让春天为你做这件事。添加@ResponseBodyproduces = "application/json"

问题是 about 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;
}

推荐阅读