JsonPath Jayway Java实现按refPath筛选值报类型错误求解
问题原因
抛出Could not determine value type错误的核心原因是输入JSON存在一层动态UUID格式的无固定键名,refPath不是顶层数组的直接属性,使用固定属性名的常规路径写法遍历到动态键层时,Jayway无法识别属性类型,触发解析异常。
可用JsonPath表达式
单值匹配(匹配refPath包含e0586818-ba2c-4b65-afec-3c48d817b584的对象)
$[*][?(@.refPath contains 'e0586818-ba2c-4b65-afec-3c48d817b584')]
多值同时匹配(需求场景:refPath同时包含两个指定UUID)
$[*][?(@.refPath contains 'e0586818-ba2c-4b65-afec-3c48d817b584' && @.refPath contains '06c089a6-4de0-43d3-8dc7-181addf4c933')]
表达式逻辑说明
$[*]:遍历最外层根数组的所有元素[?(过滤规则)]:对当前遍历到的、持有多个动态UUID键的对象做属性筛选,自动保留符合条件的键值对结构,不会丢失外层UUID键@.refPath contains 'xxx':判断当前属性值内的refPath数组是否包含目标值,多条件用&&连接即要求同时满足
Java端调用配置建议
低版本Jayway建议添加如下配置,避免遍历空节点时抛错,同时保证返回结果统一为列表结构:
import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.Option; import com.jayway.jsonpath.JsonPath; // 初始化配置 Configuration config = Configuration.builder() .options(Option.ALWAYS_RETURN_LIST, Option.SUPPRESS_EXCEPTIONS) .build(); // 执行查询 String jsonPath = "$[*][?(@.refPath contains 'e0586818-ba2c-4b65-afec-3c48d817b584' && @.refPath contains '06c089a6-4de0-43d3-8dc7-181addf4c933')]"; List<?> result = JsonPath.using(config).parse(yourInputJson).read(jsonPath);
执行后返回的结果结构和期望输出完全一致,仅保留refPath同时命中两个目标UUID的2be3d660-cab0-4db8-83b9-1baf212270c5对应条目。
注意事项
不要写成$[*].refPath这类固定属性路径,refPath和顶层数组之间隔了动态UUID键层,这类写法会直接触发类型解析错误。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

