【问题标题】:How to transform JSON file with key values to apache camel headers - Spring DSL如何将带有键值的 JSON 文件转换为 apache 骆驼头 - Spring DSL
【发布时间】:2020-06-10 12:19:12
【问题描述】:

我有一个带有键值对的 JSON 文件,我想将键值对放入标题中。 所以当我有一个内容如下的文件时:

[{"msgId": "8600C5A3-C666-4E63-BFDB-52BCF557F938", "jiraId": "ERR002"}]

我想创建名称为 msgId 且值为“8600C5A3-C666-4E63-BFDB-52BCF557F938”等的标头。

或者作为替代方案:有没有办法将交换的标头存储到文件中,以后可以在另一个交换中恢复标头?

谢谢。


编辑:我的例子。

    public void jsonToHeaders(String body, @Headers Map<String, String> headers) throws ParseException {

        LOG.info("Starting JSON conversion...");
        LOG.debug("Body input, content: {} ", body);
        JSONParser parser = new JSONParser();
        JSONObject jsonObject = (JSONObject) parser.parse(body);
        if (jsonObject != null) 
        { 
            String stringValue = null;
            String stringKey = null ;
            final String NA_STRING = "*** N/A ***";

            for (Object key : jsonObject.keySet()) {

                stringKey = ((key == null) ? NA_STRING : (String)key);
                stringValue = ((jsonObject.get(stringKey) == null) ? NA_STRING : jsonObject.get(stringKey).toString());
                headers.put(stringKey, stringValue);
                LOG.debug("Processing key {} with value {}", stringKey, stringValue);
            }
            LOG.info("Done processed JSON: {}", headers.toString());
        }
    }

【问题讨论】:

    标签: json spring-boot apache-camel spring-camel


    【解决方案1】:

    在这种情况下,您可以使用bean

    JSONToHeadersBean

    
    package org.mybean;
    
    
    import org.apache.camel.Headers;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    import org.json.simple.parser.ParseException;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    public class JSONToHeadersBean {
    
        public void jsonToHeaders(String body, @Headers Map<String, String> headers) throws ParseException {
            JSONParser parser = new JSONParser();
            JSONObject object = (JSONObject) parser.parse(body);
            object.keySet().forEach(key -> headers.put(key.toString(), object.get(key).toString()));
        }
    
        //for test
        public static void main(String[] args) throws ParseException {
            String body = "{\"msgId\": \"8600C5A3-C666-4E63-BFDB-52BCF557F938\", \"jiraId\": \"ERR002\"}";
            JSONParser parser = new JSONParser();
            JSONObject object = (JSONObject) parser.parse(body);
            final Map<String, String> headers = new HashMap<String, String>();
            object.keySet().forEach(key -> headers.put(key.toString(), object.get(key).toString()));
            System.out.println();
        }
    }
    
    

    创建 bean

    <bean class="org.mybean.JSONToHeadersBean" id="JSONToHeadersBean" name="JSONToHeadersBean"/>
    

    而且你可以在路由中使用它

    <bean method="jsonToHeaders" ref="JSONToHeadersBean"/>
    

    【讨论】:

    • 我最初是在 Spring DSL 中寻找答案,但是,看到这个非常优雅并且有空间向 bean 添加更多解析/转换实用程序,它满足并更喜欢(甚至)解决方案。我确实添加了一些 NPE 检查,首先是对 JSONObject,其次是对键的迭代。在某些情况下,密钥导致 null ,这使我成为 NPE。我的版本添加到我的问题的底部。
    【解决方案2】:

    作为替代方案,您可以将 JSON 解析为 HashMap 并将其放入标头中:

    .unmarshal().json(JsonLibrary.Jackson, java.util.Map.class)
    .setHeader("params", simple("body"))
    

    (需要camel-jackson 依赖)

    访问存储的值:

    .log(LoggingLevel.INFO, "MsgId: ${header.params[msgId]}")
    

    【讨论】:

    • 我想用 JSON 数据替换我的所有标题。但我真的很感谢您对此的看法,谢谢。
    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多