如何使用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
相关产品推荐
相关产品推荐

