如何使用JSONPath读取结构不固定的Kafka消息字段
JSONPath 适配多结构字段读取方案
核心实现逻辑:使用JSONPath的递归下降运算符..,可以忽略中间层级差异,直接匹配指定名称的后代节点,完美适配有无derivationdetails层的两种消息结构。
之前读取失败的原因
batchid返回空:首先是字段名大小写匹配问题,样例中业务ID为大写开头Id,你之前写的小写id拼写不匹配;其次$.payload[*]仅能匹配payload下的直接子属性值,结合拼写错误会直接返回空值attributes字段读取失败:一方面是层级未做兼容,另一方面你写的itemId首字母大写,和样例中全小写itemid的字段名不匹配
通用读取表达式
所有表达式均可同时适配两种消息结构,直接返回对应字段值:
1. 基础字段
# 读取业务Id(注意首字母大写和样例保持一致) $..payload..Id # 读取itemid $..payload..itemid # 读取batchid $..payload..batchid
2. attributes下的子字段
# 读取attributes下的itemid $..payload..attributes.itemid # 读取attributes下的lineNbr $..payload..attributes.lineNbr # 读取attributes下的cat $..payload..attributes.cat # 读取attributes下的subcat $..payload..attributes.subcat # 读取attributes下的indicator $..payload..attributes.indicator
3. Exception下的相关字段
# 读取Exception下所有values数组元素 $..payload..Exception.values[*] # 读取values中指定下标的type值,以下标0为例 $..payload..Exception.values[0].type # 读取values中所有rules数组内容 $..payload..Exception.values[*].rules[*] # 读取Exception下所有rulesBagInfo数组元素 $..payload..Exception.rulesBagInfo[*] # 读取rulesBagInfo中所有rulesMatch数组内容 $..payload..Exception.rulesBagInfo[*].rulesMatch[*] # 读取rulesBagInfo中的uniqueid值 $..payload..Exception.rulesBagInfo[*].uniqueid
如果需要做条件过滤,可使用过滤器语法,比如筛选type=PICK的values元素:
$..payload..Exception.values[?(@.type == 'PICK')]
内容的提问来源于stack exchange,提问作者jahan
相关产品推荐
相关产品推荐

