简体   繁体   English

Camel交换头中的Json对象未正确转换为字符串

[英]Json object in Camel exchange header not correctly converting to string

So I'm trying to split a json array with some metadata and append the metadata to each object in the array: 所以我试图用一些元数据拆分一个json数组,并将元数据附加到数组中的每个对象:

{
  "@version":"1",
  "metadata":{"key1":"value1","key2":"value2"},
  "messages":[{"msg":{...}},{"msg":{...}}, ... ]
}

to

{
  "type":"msg",
  "data":{
    "@version":"1",
    "metadata":{"key1":"value1","key2":"value2"},
    "msg":{...}
  }
}

I have the following Camel route which almost works: 我有以下Camel路线几乎可以工作:

from("direct:kafkaMsg")
    .routeId("rKafkaMsg")
    .log(DEBUG, "JSON: ${body}")
    .setHeader("@version").jsonpath("$.@version")
    .setHeader("metadata").jsonpathWriteAsString("$.metadata") // not writing as string
    .split().jsonpathWriteAsString("$.messages..msg")
        .setHeader("msgId", jsonpath("$.msgNo"))
        .setHeader("kafka.KEY", simple("${header.msgId}"))
        .setBody(simple("{\"type\":\"msg\","
            + "\"data\":{\"@version\":\"${header.@version}\",\"metadata\":${header.metadata},"
            + "\"msg\":${body}}}"))
        .log(DEBUG, "body: ${body}")
        .log(INFO, "msgPush: writing msg to kafka - msgId: ${header.msgId}")
        .setProperty(Exchange.CHARSET_NAME, constant("UTF-8"))
        .to("kafka:sometopic?partitioner=" + DefaultPartitioner.class.getName())
    .end();

But the Json I actually get like this is: 但Json我实际上是这样的:

{
  "type":"msg",
  "data":{
    "@version":"1",
    "metadata":{key1="value1",key2="value2"},  // wrong. This looks like mapToString
    "msg":{...}
  }
}

When I had .split().jsonpath("$.messages..msg") before, the 'msg' object was also wrongly formatted in the output but jsonpathWriteAsString() helped in this case. 当我之前有.split().jsonpath("$.messages..msg") ,'msg'对象在输出中也被错误地格式化了,但jsonpathWriteAsString()在这种情况下有所帮助。 I also tried jsonpath("$.metadata", String.class) but it did not help. 我也尝试了jsonpath("$.metadata", String.class)但它没有帮助。

Does anybody know how to fix this? 有人知道如何解决这个问题吗? Thanks. 谢谢。

I solved this using a workaround involving a Processor: 我使用涉及处理器的解决方法解决了这个问题:

.split().jsonpath("$.messages..msg")
    .setHeader("msgId", jsonpath("$.msgNo"))
    .setHeader("kafka.KEY", simple("${header.msgId}"))
    // Processor instead of setBody()
    .process(exchange -> {
        JsonObject data = new JsonObject();
        data.put("@version", exchange.getIn().getHeader("@version"));
        data.put("metadata", exchange.getIn().getHeader("metadata"));
        data.put("msg", exchange.getIn().getBody());
        JsonObject body = new JsonObject();
        body.put("type", "msg");
        body.put("data", data);
        exchange.getOut().setBody(body.toJson());
        exchange.getOut().setHeaders(exchange.getIn().getHeaders());
    })

I prefer this solution anyway because I don't have to write part of the json string myself. 无论如何我更喜欢这个解决方案,因为我不必自己编写部分json字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM