Как преобразовать файл JSON со значениями ключа в apache заголовки верблюда - Spring DSL - PullRequest
2 голосов
/ 26 февраля 2020

У меня есть JSON Файл с парами ключ-значение, и я хочу поместить пары ключ-значение в заголовки. Поэтому, когда у меня есть файл с таким содержимым:

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

, я хочу создать заголовки с именем msgId и значением "8600C5A3-C666-4E63-BFDB-52BCF557F938", et c.

Или как альтернатива: есть ли способ сохранить заголовки обмена в файл, который впоследствии можно будет восстановить в другом обмене?

Спасибо.


РЕДАКТИРОВАТЬ: мой форк примера.

    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());
        }
    }

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

В качестве альтернативы вы можете проанализировать JSON в HashMap и поместить его в заголовок:

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

(требуется camel-jackson зависимость)

Для доступа к сохраненным значениям:

.log(LoggingLevel.INFO, "MsgId: ${header.params[msgId]}")
2 голосов
/ 26 февраля 2020

Вы можете использовать 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"/>
...