Thứ tự các đối tượng JSON bằng cách sử dụng ObjectMapper của Jackson


92

Tôi đang sử dụng ObjectMapper để thực hiện ánh xạ java-json của mình.

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
ow.writeValue(new File( fileName +".json"), jsonObj);

đây là lớp java của tôi:

public class Relation {

private String id;
private String source;
private String target;
private String label;
private List<RelAttribute> attributes;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getSource() {
    return source;
}

public void setSource(String source) {
    this.source = source;
}

public String getTarget() {
    return target;
}

public void setTarget(String target) {
    this.target = target;
}

public String getLabel() {
    return label;
}
public void setLabel(String label) {
    this.label = label;
}

public void setAttributes(List<RelAttribute> attributes) {
    this.attributes = attributes;
}

public List<RelAttribute> getAttributes() {
    return attributes;
}

}

đây là những gì tôi nhận được:

{
    "id" : "-75da69d3-79c8-4000-a3d8-b10350a57a7e",
    "attributes" : [ {
      "attrName" : "ID",
      "attrValue" : ""
    }, {
      "attrName" : "Description",
      "attrValue" : "Primary Actor"
    }, {
      "attrName" : "Status",
      "attrValue" : ""
    } ],
    "label" : "new Label",
    "target" : "-46b238ac-b8b3-4230-b32c-be9707f8b691",
    "source" : "-daa34638-061a-45e0-9f2e-35afd6c271e0"
  }

Vì vậy, câu hỏi của tôi bây giờ là, làm thế nào tôi có thể lấy đầu ra json này:

{
    "id" : "-75da69d3-79c8-4000-a3d8-b10350a57a7e",
    "label" : "new Label",
    "target" : "-46b238ac-b8b3-4230-b32c-be9707f8b691",
    "source" : "-daa34638-061a-45e0-9f2e-35afd6c271e0",
    "attributes" : [ {
      "attrName" : "ID",
      "attrValue" : ""
    }, {
      "attrName" : "Description",
      "attrValue" : "Primary Actor"
    }, {
      "attrName" : "Status",
      "attrValue" : ""
    } ]

  }

Tôi muốn nó với thứ tự giống như trong khai báo java của tôi. Có cách nào để chỉ định nó không? Có thể với chú thích hoặc những thứ tương tự?


2
Thứ tự tài sản là điểm quan trọng cho một mã / mùi thiết kế. Bất cứ điều gì đang sử dụng JSON không nên quan tâm đến thứ tự (liệt kê có, thuộc tính không).
ach

25
Tôi chỉ cần nó vì lợi ích của khả năng đọc :-)
justSaid

11
@ach đó chỉ là không đúng. Một bản đồ có thứ tự là một kiểu dữ liệu rất phổ biến và rất hữu ích. Thứ tự mong muốn không phải là một mùi gì cả.

Câu trả lời:


193
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }

@justSaid, ý bạn là gì? Bạn có muốn sắp xếp các trường của phần tử danh sách theo cùng một cách không?
Andrey Atapin

5

Bạn có biết có một cách thuận tiện để chỉ định thứ tự bảng chữ cái không?

@JsonPropertyOrder(alphabetic = true)
public class Relation { ... }

Nếu bạn có yêu cầu cụ thể, đây là cách bạn định cấu hình đặt hàng tùy chỉnh:

@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }

3

Bạn có thể dùng @XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "response", propOrder = { "prop1", "prop2",
        "prop3", "prop4", "prop5", "prop6" }).

@JsonPropertyOrder yêu cầu một bình mới được thêm vào.


3
@JsonPropertyOrder không yêu cầu jar mới vì nếu bạn sử dụng jackson, nó đã được bao gồm.
Patrick

1
Nó phụ thuộc vào khung công tác mà bạn đang sử dụng. Nếu bạn không sử dụng jackson thì tốt hơn nên thực hiện ở trên sẽ áp dụng cho cả json và xml và không cần cấu hình thêm nếu bạn muốn trả về dữ liệu ở định dạng xml
user1001

Có, nhưng câu hỏi được đặt ra bằng cách sử dụng jackson. Nếu bạn muốn cung cấp một giải pháp mà không sử dụng jackson, bạn phải tỉ mỉ hơn trong câu trả lời của mình.
Patrick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.