我使用Kafka流DSL并映射将KStream<String, JsonNode>
转换为KStream<String, String>
。
在ValueMapper
函数中,我简单地返回new ValueMapper("key", "some constant string")
,但是在使用KStream.to("some topic")
将值发送回Kafka的情况下,得到的结果是添加了双引号。
我的代码是这样的:
KStream<String, JsonNode> views = builder.stream("fromTopic");
views.map(new ValueKMapper()).to("toTopic");
和ValueMapper
仅实现KeyValueMapper
,而apply()
的代码是:
public KeyValue<String, String> apply(String key, JsonNode value)
{
return new KeyValue<String,String>("a", "hello");
}
然后当我消费toTopic
时,我得到了""hello""
,并加上了引号。
也许这是Kafka流的错误?
答案 0 :(得分:0)
我认为您在问题中提供的方法apply()
public KeyValue<String, String> apply(String key, JsonNode value)
{
return new KeyValue<String,String>("a", "hello");
}
没有将硬编码的键和值传递给KeyValue
的构造函数。我的猜测是问题与JsonNode
有关。也许,您方法的实际实现使用了value.get(key)
,即
public KeyValue<String, String> apply(String key, JsonNode value)
{
return new KeyValue<String,String>(key, value.get(key));
}
但是,value.get(key)
将返回TextNode
,而toString()
方法将返回包含引号的TextNode
的字符串表示形式。为了正确解析JsonNode
,您需要使用textValue()
方法,以便您的方法成为
public KeyValue<String, String> apply(String key, JsonNode value)
{
return new KeyValue<String,String>(key, value.get(key).textValue());
}
示例:
假设您有一个键a
和一个值hello
,
json.get("a").toString())
将在返回"hello"
json.get("a").textValue();
将返回hello
答案 1 :(得分:0)
您可能会使用Json serde作为默认设置。尝试在写入接收器时添加字符串Serde:
.to("toTopic", Produced.with(Serdes.String(), Serdes.String()));