Jackson의 ObjectMapper를 사용한 JSON 객체 순서


92

Java-json 매핑을 수행하기 위해 ObjectMapper 를 사용하고 있습니다.

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

이것은 내 자바 클래스입니다.

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;
}

}

이것이 내가 얻는 것입니다.

{
    "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"
  }

이제 내 질문은이 json 출력을 어떻게 얻을 수 있습니까?

{
    "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" : ""
    } ]

  }

내 자바 선언과 동일한 순서로 원합니다. 그것을 지정하는 방법이 있습니까? 주석이나 그런 것들과 함께?


2
속성 순서는 코드 / 디자인 냄새에 중요한 포인트입니다. JSON을 사용하는 것이 무엇이든 순서에 대해 신경 쓰지 않아야합니다 (예, 속성 없음 나열).
ach

25
가독성을 위해 필요합니다 :-)
justSaid

11
@ach는 사실이 아닙니다. 정렬 된 맵은 매우 일반적이고 매우 유용한 데이터 유형입니다. 원하는 순서는 전혀 냄새가 아닙니다.
염소

답변:



5

알파벳 순서를 지정하는 편리한 방법이 있다는 것을 알고 있습니까?

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

특정 요구 사항이있는 경우 여기에서 맞춤 주문을 구성하는 방법 :

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

3

당신이 사용할 수있는 @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder 추가하려면 새 항아리가 필요합니다.


3
@JsonPropertyOrder는 jackson을 사용하는 경우 이미 포함되어 있기 때문에 새 jar가 필요하지 않습니다.
Patrick

1
사용중인 프레임 워크에 따라 다릅니다. jackson을 사용하지 않는 경우 json 및 xml 모두에 적용되는 위의 구현을 사용하는 것이 더 좋으며 xml 형식으로 데이터를 반환하려면 추가 구성이 필요하지 않습니다
user1001

예,하지만 jackson을 사용하여 질문했습니다. jackson을 사용하지 않고 솔루션을 제공하려면 더 구체적이어야합니다.
Patrick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.