如何用JsonPath合并数组?Java场景下的数组联合查询问题
使用JsonPath合并多数组并查询指定元素
问题核心
$.root.[cars,vans]返回的是嵌套数组结构([[cars元素], [vans元素]]),而非扁平化的单数组,因此直接使用索引[2]会分别作用于两个子数组,导致返回空值。
解决方案:利用flatten()函数扁平化数组
在Java常用的Jayway JsonPath实现中,可通过flatten()函数将嵌套数组转换为单个数组,之后就能直接通过索引访问合并后的元素:
正确的JsonPath表达式
$.root.[cars,vans].flatten()[2].colour
Java代码示例
import com.jayway.jsonpath.JsonPath; public class JsonPathMergeExample { public static void main(String[] args) { String json = "{\"root\":{\"cars\":[{\"make\":\"Ford\", \"colour\":\"white\", \"doors\":4},{\"make\":\"Audi\", \"colour\":\"silver\",\"doors\":2}],\"vans\":[{\"make\":\"Ford\", \"colour\":\"blue\", \"weight\":2}]}}"; String targetColour = JsonPath.read(json, "$.root.[cars,vans].flatten()[2].colour"); System.out.println(targetColour); // 输出: blue } }
备选方案:Java代码手动扁平化
若使用的JsonPath实现不支持flatten(),可先获取嵌套结果集合,再通过Java代码手动扁平化后取值:
import com.jayway.jsonpath.JsonPath; import java.util.List; import java.util.stream.Collectors; public class JsonPathManualMerge { public static void main(String[] args) { String json = "{\"root\":{\"cars\":[{\"make\":\"Ford\", \"colour\":\"white\", \"doors\":4},{\"make\":\"Audi\", \"colour\":\"silver\",\"doors\":2}],\"vans\":[{\"make\":\"Ford\", \"colour\":\"blue\", \"weight\":2}]}}"; // 获取所有颜色的嵌套列表 List<List<String>> nestedColours = JsonPath.read(json, "$.root.[cars,vans][*].colour"); // 扁平化处理 List<String> allColours = nestedColours.stream() .flatMap(List::stream) .collect(Collectors.toList()); // 获取合并后的第3个元素(索引为2) String targetColour = allColours.get(2); System.out.println(targetColour); // 输出: blue } }
内容的提问来源于stack exchange,提问作者S Bullen
相关产品推荐
相关产品推荐

