【问题标题】:How to properly convert HashMap<String,List<Object>> to Json with array of json object如何使用 json 对象数组正确地将 HashMap<String,List<Object>> 转换为 Json
【发布时间】:2022-02-02 00:47:26
【问题描述】:

我有一个 Kafka 消息流,想构建一个 HashMap&lt;String,List&lt;Object&gt;&gt; 用作 Json 格式的 API 响应。

for (ConsumerRecord<String,String> consumerRecord : records) {
    if(!responses.containsKey(consumerRecord.topic())){
        responses.put(consumerRecord.topic(), new ArrayList<Object>());
    }
    responses.get(consumerRecord.topic()).add(JSONObject.stringToValue(consumerRecord.value()));
}

预期响应:

{
    "topic1": [
        {"field1":"value1","field2":"value2","field3":"value3"}
    ],
    "topic2": [
        {"field1":"value1","field2":"value2","field3":"value3"},
        {"anotherfield1":"anothervalue1","anotherfield2":"anothervalue2"}
    ]
}

实际反应:

{
    "topic1": [
        "{\"field1\":\"value1\",\"field2\":\"value2\",\"field3\":\"value3\"}"
    ],
    "topic2": [
        "{\"field1\":\"value1\",\"field2\":\"value2\",\"field3\":\"value3\"}",
        "{\"anotherfield1\":\"anothervalue1\",\"anotherfield2\":\"anothervalue2\"}"
    ]
}

【问题讨论】:

    标签: java json api apache-kafka


    【解决方案1】:

    斜线引号 (") 符号只是 JSON 中正确转义的引号。您的解析器没有将内部 JSON 识别为 JSON,而是将它们视为字符串。因此在字符串中它转义了所有 " 符号。我建议您可以使用Json-Jackson (also known as Faster XML) library 的类ObjectMapper(Maven 工件here)。我编写了自己的开源库 MgntUtils,它具有基于 Json-Jackson 的 JSON 解析器。使用这个库,您可以轻松地将 JSON 字符串解析为 Map

    Map<String, Object> myMap = null;
    try {
          myMap = JsonUtils.readObjectFromJsonString(jsonString, Map.class);
        }
    } catch (IOException e) {
       ...
    }
    

    这是JsonUtils 的Javadoc。 MgntUtils 库的 Maven 工件可以在 here 找到,作为 jar 的库以及 Javadoc 和源代码可以在 Github here 上找到

    【讨论】:

    • 会试试那个。现在我会坚持我的回答,因为它也解决了我的问题。谢谢。
    【解决方案2】:

    现在正在使用这些更改:

    HashMap<String,List<Object>> responses = new HashMap<String,List<Object>>();
    
    for (ConsumerRecord<String,String> consumerRecord : records) {
        if(!responses.containsKey(consumerRecord.topic())){
            responses.put(consumerRecord.topic(), new ArrayList<Object>());
        }
        responses.get(consumerRecord.topic()).add(new JSONObject(consumerRecord.value()));
    }
    
    jsonObject = new JSONObject(responses);
    return jsonObject.toMap();
    
    
    1. 将Kafka消息字符串转换为JSONObject new JSONObject(consumerRecord.value())
    2. 使用 Map 从 Map 构造 JSONObject jsonObject = new JSONObject(responses);
    3. 使用jsonObject.toMap();返回映射

    【讨论】:

    • 如果你正确设置了反序列化器,你可以重构new JSONObject(consumerRecord.value())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2017-11-04
    • 2017-03-27
    • 2019-02-27
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多