Порядок об’єктів JSON за допомогою ObjectMapper Джексона


92

Я використовую ObjectMapper, щоб зробити своє зіставлення java-json.

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

це мій клас Java:

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

  }

Я хочу це з тим самим порядком, що і в моїй декларації Java. Чи є спосіб це вказати? Може з анотаціями чи подібними речами?


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, вона вже включена.
Патрік

1
Це залежить від фреймворку, який ви використовуєте. Якщо ви не використовуєте jackson, то краще скористатися вищевказаною реалізацією, яка застосовуватиметься як до json, так і до xml, і не потрібно додаткової конфігурації, якщо ви хочете повернути дані у форматі xml
user1001

Так, але питання було задано за допомогою Джексона. Якщо ви хочете надати рішення без використання Джексона, ви повинні бути більш розбірливими у своїй відповіді.
Патрік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.