使用Rest Assured Java无法定位路径,修改嵌套JSON字段失败求助
问题分析
你的问题在于Details字段的值是一个转义后的JSON字符串,而非嵌套的JSON对象。因此直接用Details.user这样的JsonPath路径无法定位到内部的user和password字段——JsonPath会把Details当作普通字符串处理,无法穿透到其内部结构。
解决方法
需要先将Details字段的字符串值解析为独立的JSON对象,修改内部字段后再序列化为转义字符串,最后替换回原JSON的Details字段。以下是调整后的代码:
ObjectMapper mapper = new ObjectMapper(); ObjectNode parentNode = (ObjectNode) mapper.readTree(new File(templatePath)); // 复用JsonPath配置,避免循环内重复创建 Configuration config = Configuration.builder() .jsonProvider(new JacksonJsonNodeJsonProvider()) .mappingProvider(new JacksonMappingProvider()).build(); for (int i = 0; i < list.size(); i++) { String x = list.get(i); // 最多分割为两部分,防止值中包含": "导致错误拆分 String[] arr = x.split(": ", 2); String path = arr[0].replace("|", "."); String actualVal = arr.length >= 2 ? arr[1] : ""; if (path.startsWith("Details.")) { // 处理Details内部字段的修改逻辑 String innerPath = path.substring("Details.".length()); // 1. 提取Details的字符串值并解析为JSON对象 String detailsStr = parentNode.get("Details").asText(); ObjectNode detailsNode = (ObjectNode) mapper.readTree(detailsStr); // 2. 修改内部字段(支持复杂路径如Details.address.city) JsonPath.parse(detailsNode, config).set(innerPath, actualVal); // 3. 将修改后的内部对象序列化为带转义的字符串 String newDetailsStr = mapper.writeValueAsString(detailsNode); // 4. 替换回原父节点的Details字段 parentNode.put("Details", newDetailsStr); } else { // 处理普通字段的修改 JsonPath.parse(parentNode, config).set(path, actualVal); } } // 若需要将修改后的JSON写入文件,可添加以下代码 // mapper.writeValue(new File(outputPath), parentNode);
关键调整说明
- 分割逻辑优化:使用
split(": ", 2)确保值中包含:时不会被错误分割。 - 嵌套JSON处理:针对以
Details.开头的路径,单独解析内部JSON字符串,修改后重新序列化。 - 配置复用:将JsonPath配置移出循环,避免重复创建提升性能。
内容的提问来源于stack exchange,提问作者satish rathod
相关产品推荐
相关产品推荐

