You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Jackson提取JSON数组中子对象的原始字符串?

用Jackson提取JSON数组中子对象的原始字符串

不需要自定义反序列化器,Jackson原生API就能实现需求,核心思路是用JsonNode作为中间载体,避免将子对象解析为具体Java对象,从而完整保留原始JSON内容。

实现步骤

  1. 将整个JSON字符串解析为JsonNode,它会完整保留原始JSON的字段顺序、空字符串等细节,不会做强制类型转换。
  2. 定位到目标数组节点,遍历其中的每个子节点。
  3. 将每个子节点重新序列化为字符串,收集到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:31:01