Json object in Camel exchange header 未正确转换为字符串
Json object in Camel exchange header not correctly converting to string
所以我试图用一些元数据拆分 json 数组,并将元数据附加到数组中的每个 object:
{
"@version":"1",
"metadata":{"key1":"value1","key2":"value2"},
"messages":[{"msg":{...}},{"msg":{...}}, ... ]
}
到
{
"type":"msg",
"data":{
"@version":"1",
"metadata":{"key1":"value1","key2":"value2"},
"msg":{...}
}
}
我有以下几乎可行的 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();
但是 Json 我实际上是这样的:
{
"type":"msg",
"data":{
"@version":"1",
"metadata":{key1="value1",key2="value2"}, // wrong. This looks like mapToString
"msg":{...}
}
}
当我之前有 .split().jsonpath("$.messages..msg")
时,'msg' object 在输出中的格式也有误,但 jsonpathWriteAsString()
在这种情况下有所帮助。我也试过 jsonpath("$.metadata", String.class)
但没有用。
有人知道如何解决这个问题吗?谢谢。
我使用涉及处理器的解决方法解决了这个问题:
.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());
})
无论如何我更喜欢这个解决方案,因为我不必自己编写 json 字符串的一部分。
所以我试图用一些元数据拆分 json 数组,并将元数据附加到数组中的每个 object:
{
"@version":"1",
"metadata":{"key1":"value1","key2":"value2"},
"messages":[{"msg":{...}},{"msg":{...}}, ... ]
}
到
{
"type":"msg",
"data":{
"@version":"1",
"metadata":{"key1":"value1","key2":"value2"},
"msg":{...}
}
}
我有以下几乎可行的 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();
但是 Json 我实际上是这样的:
{
"type":"msg",
"data":{
"@version":"1",
"metadata":{key1="value1",key2="value2"}, // wrong. This looks like mapToString
"msg":{...}
}
}
当我之前有 .split().jsonpath("$.messages..msg")
时,'msg' object 在输出中的格式也有误,但 jsonpathWriteAsString()
在这种情况下有所帮助。我也试过 jsonpath("$.metadata", String.class)
但没有用。
有人知道如何解决这个问题吗?谢谢。
我使用涉及处理器的解决方法解决了这个问题:
.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());
})
无论如何我更喜欢这个解决方案,因为我不必自己编写 json 字符串的一部分。