Groovy调用parseText报错:传入LinkedHashMap而非字符串,求排查
问题:检查Kafka消息中指定键存在性时的报错问题
问题详情
我需要检查Kafka输出消息中是否存在指定键,若存在则执行后续操作。Kafka主题的输出消息如下:
["random_name_547hcg": { "access_Data": { "name": "BU", "repo": "CRX", "Id": "908hngt" }, "level": "easy", "check_status": { "prod": 0, "dev": 3, "QA": 2, "UAT": 1 }, "Test_Result": { "results": [ { "id": "a20e025e0451eeed05d94a4cfc4523e58a", "name": "ImageVerify", "Release": "3.0", "wrapper": [ "All" ] } ] }, "output": "failure" }]
该消息的数据类型为java.util.LinkedHashMap。
我的Groovy代码片段如下:
import groovy.json.JsonSlurper import kafkarelatedpackage key = 'random_name_547hcg' def slurper = new groovy.json.JsonSlurper() def kafConsumer = new ConsumerClassKafka(servers, topic) def kafmsg = kafConsumer.getMessages() messg = slurper.parseText(kafmsg) if (messg.containsKey(key)) { println "Yes" } else { println "No" }
运行时抛出如下错误:
Possible solutions: parseText(java.lang.String), parse(java.io.File), parse(java.io.Reader), parse(java.net.URL)
请问我哪里出错了?
问题原因及解决方案
- 错误原因:
kafmsg已经是java.util.LinkedHashMap类型,但你调用的JsonSlurper.parseText()方法仅接受字符串参数,类型不匹配导致报错。 - 解决方案:直接使用Kafka消费者返回的
LinkedHashMap对象进行键存在性检查,无需再用JsonSlurper解析。修改后的代码如下:
import kafkarelatedpackage key = 'random_name_547hcg' def kafConsumer = new ConsumerClassKafka(servers, topic) def messg = kafConsumer.getMessages() if (messg.containsKey(key)) { println "Yes" } else { println "No" }
说明:Kafka消费者已经完成了消息的反序列化工作,将消息转换成了LinkedHashMap,所以直接操作这个Map对象即可。如果需要访问嵌套结构的数据,比如access_Data下的name,可以直接通过messg[key].access_Data.name这样的方式获取。
内容的提问来源于stack exchange,提问作者Chel MS
相关产品推荐
相关产品推荐

