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

如何使用Java调整JSON数组中对象的属性顺序?

如何在Java中调整JSON数组内对象的属性顺序

嘿,这个需求用Jackson库就能完美解决——它是Java生态里处理JSON最常用的工具之一,对序列化顺序的控制非常灵活。下面给你两种实用的实现方案:

方案1:通过实体类注解直接指定顺序

如果你的JSON可以映射到自定义实体类,这是最直接的方式。我们可以给Product类添加@JsonPropertyOrder注解,明确指定属性的序列化顺序。

步骤1:定义实体类

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import java.util.List;

// 外层数据包装类
class DataWrapper {
    private List<Data> data;

    // 按需添加构造器、getter、setter
    public List<Data> getData() { return data; }
    public void setData(List<Data> data) { this.data = data; }
}

class Data {
    private String ERP; // 注意:带前导零的编号建议用String,避免数值类型丢失前导零
    private String Issuedate;
    private Integer Shippingpoint;
    private String Shiptoparty;
    private List<Product> products;

    // 按需添加构造器、getter、setter
    public String getERP() { return ERP; }
    public void setERP(String ERP) { this.ERP = ERP; }
    public String getIssuedate() { return Issuedate; }
    public void setIssuedate(String Issuedate) { this.Issuedate = Issuedate; }
    public Integer getShippingpoint() { return Shippingpoint; }
    public void setShippingpoint(Integer shippingpoint) { Shippingpoint = shippingpoint; }
    public String getShiptoparty() { return Shiptoparty; }
    public void setShiptoparty(String shiptoparty) { Shiptoparty = shiptoparty; }
    public List<Product> getProducts() { return products; }
    public void setProducts(List<Product> products) { this.products = products; }
}

// 核心:用@JsonPropertyOrder指定属性序列化顺序
@JsonPropertyOrder({"SKUno", "QTY", "Unit"})
class Product {
    private String SKUno;
    private Double QTY;
    private String Unit;

    // 按需添加构造器、getter、setter
    public String getSKUno() { return SKUno; }
    public void setSKUno(String SKUno) { this.SKUno = SKUno; }
    public Double getQTY() { return QTY; }
    public void setQTY(Double QTY) { this.QTY = QTY; }
    public String getUnit() { return Unit; }
    public void setUnit(String unit) { Unit = unit; }
}

步骤2:序列化测试

用Jackson的ObjectMapper解析原JSON,再重新序列化就能得到顺序正确的结果:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        String originalJson = "{\"data\": [ { \"ERP\": \"0080001\", \"Issuedate\": \"20181102\", \"Shippingpoint\": 503, \"Shiptoparty\": \"0088000\", \"products\": [ { \"QTY\": 0.000, \"SKUno\": \"000000000011000077\", \"Unit\": \"L\" }, { \"QTY\": 0.000, \"SKUno\": \"000000000011000078\", \"Unit\": \"L\" } ] } ]}";

        ObjectMapper mapper = new ObjectMapper();
        // 解析原JSON为实体类对象
        DataWrapper wrapper = mapper.readValue(originalJson, DataWrapper.class);
        // 重新序列化,此时products内的属性会按注解指定的顺序输出
        String orderedJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(wrapper);

        System.out.println(orderedJson);
    }
}

运行后输出的JSON中,products数组内的对象属性顺序就会是SKUno → QTY → Unit。

方案2:无法修改实体类?用MixIn动态绑定顺序

如果Product类是第三方库提供的,没法直接加注解,可以用Jackson的MixIn功能,动态给目标类绑定序列化顺序规则。

步骤1:定义MixIn类

import com.fasterxml.jackson.annotation.JsonPropertyOrder;

// 这个类仅用来定义序列化规则,无需实际业务逻辑
@JsonPropertyOrder({"SKUno", "QTY", "Unit"})
abstract class ProductMixIn {}

步骤2:配置ObjectMapper并测试

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        String originalJson = "{\"data\": [ { \"ERP\": \"0080001\", \"Issuedate\": \"20181102\", \"Shippingpoint\": 503, \"Shiptoparty\": \"0088000\", \"products\": [ { \"QTY\": 0.000, \"SKUno\": \"000000000011000077\", \"Unit\": \"L\" }, { \"QTY\": 0.000, \"SKUno\": \"000000000011000078\", \"Unit\": \"L\" } ] } ]}";

        ObjectMapper mapper = new ObjectMapper();
        // 给Product类动态绑定MixIn规则
        mapper.addMixIn(Product.class, ProductMixIn.class);

        DataWrapper wrapper = mapper.readValue(originalJson, DataWrapper.class);
        String orderedJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(wrapper);

        System.out.println(orderedJson);
    }
}

这样不需要修改原Product类的代码,同样能实现属性顺序的调整。

额外提示

  • 如果你用的是Gson等其他JSON库,思路类似:Gson可以通过自定义TypeAdapter来控制属性顺序,但Jackson的方案更直观。
  • 对于带前导零的编号(比如0080001、000000000011000077),一定要用String类型存储,避免Java数值类型自动丢失前导零。

内容的提问来源于stack exchange,提问作者Kaushik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:55