如何从嵌套JSON中提取特定对象?是否需使用Jackson库?
提取JSON特定分支的实现方案
首先明确:提取JSON特定分支不需要强制依赖Jackson库,有多种可行方案,下面分场景说明:
一、使用Jackson实现(推荐,适合复杂场景)
如果项目中已经在用Jackson,这是很便捷的方式,有两种常见思路:
- 通过POJO映射过滤
定义一个只包含prop1和prop3的实体类,直接把原JSON反序列化到该类,再序列化就能得到目标JSON:
import com.fasterxml.jackson.databind.ObjectMapper; class TargetDTO { private String prop1; private Prop3 prop3; // 省略getter、setter、构造方法 static class Prop3 { private String child; // 省略getter、setter } } public class JsonExtract { public static void main(String[] args) throws Exception { String originalJson = "{\"prop1\":\"val1\",\"prop2\":{\"child\":\"childval\"},\"prop3\":{\"child\":\"childval\"}}"; ObjectMapper mapper = new ObjectMapper(); TargetDTO target = mapper.readValue(originalJson, TargetDTO.class); String resultJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(target); System.out.println(resultJson); } }
- 通过树模型手动提取
利用Jackson的JsonNode树结构,按需提取指定节点后组装成新JSON:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; public class JsonExtract { public static void main(String[] args) throws Exception { String originalJson = "{\"prop1\":\"val1\",\"prop2\":{\"child\":\"childval\"},\"prop3\":{\"child\":\"childval\"}}"; ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(originalJson); ObjectNode result = mapper.createObjectNode(); result.set("prop1", root.get("prop1")); result.set("prop3", root.get("prop3")); String resultJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result); System.out.println(resultJson); } }
二、不使用Jackson的替代方案
1. 使用Java原生JSON API(JDK 11+)
JDK 11及以上自带javax.json包,无需额外依赖就能处理:
import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; import java.io.StringReader; import java.io.StringWriter; public class JsonExtract { public static void main(String[] args) { String originalJson = "{\"prop1\":\"val1\",\"prop2\":{\"child\":\"childval\"},\"prop3\":{\"child\":\"childval\"}}"; try (JsonReader reader = Json.createReader(new StringReader(originalJson))) { JsonObject root = reader.readObject(); JsonObject result = Json.createObjectBuilder() .add("prop1", root.getString("prop1")) .add("prop3", root.getJsonObject("prop3")) .build(); StringWriter writer = new StringWriter(); Json.createWriter(writer).writeObject(result); System.out.println(writer.toString()); } } }
2. 使用Gson库
如果项目用Gson,也能轻松实现:
import com.google.gson.Gson; import com.google.gson.JsonObject; public class JsonExtract { public static void main(String[] args) { String originalJson = "{\"prop1\":\"val1\",\"prop2\":{\"child\":\"childval\"},\"prop3\":{\"child\":\"childval\"}}"; Gson gson = new Gson(); JsonObject root = gson.fromJson(originalJson, JsonObject.class); JsonObject result = new JsonObject(); result.add("prop1", root.get("prop1")); result.add("prop3", root.get("prop3")); System.out.println(gson.toJson(result)); } }
总结
- 若项目已经引入Jackson,用它处理高效且符合现有技术栈;
- 不想加额外依赖的话,JDK 11+的原生API就能满足需求;
- 其他JSON库如Gson也能实现相同效果,完全不需要局限于Jackson。
内容的提问来源于stack exchange,提问作者sana abhi
相关产品推荐
相关产品推荐

