如何使用JSONPath查询JSON属性中嵌套JSON字符串的内部字段
内嵌JSON字符串的JSONPath查询解决方案
场景说明
标准JSONPath语法本身不支持直接解析字符串类型的JSON内容,所有方案均需要基于现有结构做预处理后完成查询。
可选方案
1. IDEA临时数据探索方案
- 第一步:用JSONPath语法
$..extraData提取所有内嵌JSON字符串,复制查询结果 - 第二步:通过文本替换功能批量删除字符串的转义符
\和首尾的包裹引号,将所有结果拼接为合法JSON数组 - 第三步:将处理后的JSON数组粘贴到IDEA JSON编辑器中,用
$..foo语法即可查询所有目标值,导出结果后手动去重即可得到枚举值列表
2. Java生产环境批量处理方案
直接基于Jackson做双层解析,自动完成去重,代码示例:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import java.util.HashSet; import java.util.Set; public class NestedJsonParser { public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); // 替换为你的原始JSON内容 String rawJson = "[{\"extraData\":\"{\\\"foo\\\":\\\"bar\\\"}\"}]"; ArrayNode outerArray = (ArrayNode) objectMapper.readTree(rawJson); Set<String> distinctFooValues = new HashSet<>(); for (JsonNode item : outerArray) { // 解析内嵌的JSON字符串为结构化节点 JsonNode extraDataNode = objectMapper.readTree(item.get("extraData").asText()); if (extraDataNode.has("foo")) { distinctFooValues.add(extraDataNode.get("foo").asText()); } } // 输出去重后的枚举值 System.out.println(distinctFooValues); } }
该方案支持百万级以上大规模数据集处理,需要查询其他内嵌字段时,只需修改extraDataNode的读取逻辑即可。
3. 纯JSONPath查询适配方案
如果必须用纯JSONPath完成所有查询,提前做一次全量数据转换即可:
- 编写批量转换脚本,遍历所有原始数据,将所有JSON字符串类型的属性解析为结构化JSON节点,生成新的标准JSON数据集
- 转换完成后的数据集直接用
$.*.extraData.foo即可正常查询目标值,去重操作可通过查询后的集合工具完成
内容的提问来源于stack exchange,提问作者usr-local-ΕΨΗΕΛΩΝ
相关产品推荐
相关产品推荐

