如何让Jackson提取JSON数组中子对象的原始字符串?
用Jackson提取JSON数组中子对象的原始字符串
不需要自定义反序列化器,Jackson原生API就能实现需求,核心思路是用JsonNode作为中间载体,避免将子对象解析为具体Java对象,从而完整保留原始JSON内容。
实现步骤
- 将整个JSON字符串解析为
JsonNode,它会完整保留原始JSON的字段顺序、空字符串等细节,不会做强制类型转换。 - 定位到目标数组节点,遍历其中的每个子节点。
- 将每个子节点重新序列化为字符串,收集到
List<String>中。
示例代码
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; public class RawJsonItemExtractor { public static void main(String[] args) throws Exception { // 原始输入JSON String inputJson = "{\"items\": [{\"url\": \"\", \"name\": \"foo\"}, {\"url\": \"https://example.com\", \"name\": \"bar\"}]}"; ObjectMapper mapper = new ObjectMapper(); // 禁用字段排序,保证输出和原始子对象的字段顺序一致 mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, false); // 解析为JsonNode JsonNode rootNode = mapper.readTree(inputJson); JsonNode itemsArray = rootNode.get("items"); List<String> rawItemStrings = new ArrayList<>(); if (itemsArray.isArray()) { for (JsonNode itemNode : itemsArray) { // 将子节点转回原始JSON字符串 rawItemStrings.add(mapper.writeValueAsString(itemNode)); } } // 输出结果 for (String rawItem : rawItemStrings) { System.out.println(rawItem); } } }
关键说明
- 字段顺序问题:通过禁用
ORDER_MAP_ENTRIES_BY_KEYS配置,Jackson在序列化JsonNode时会严格遵循原始JSON的字段顺序,不会自动排序。 - 空URL转null问题:因为没有将
url字段解析为URL类型,而是保留了原始的JSON节点结构,所以空字符串""会原样输出,不会被转为null。 - 全程不需要自定义反序列化器,利用Jackson原生的
JsonNode和ObjectMapper即可满足需求。
内容的提问来源于stack exchange,提问作者user3742898
相关产品推荐
相关产品推荐

