Порядок объектов 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, не должно заботиться о порядке (перечисляет да, свойства нет).
ач
26
Мне это просто нужно для читабельности :-)
justSaid
11
@ach, это неправда. Упорядоченная карта - очень распространенный и очень полезный тип данных. Желание порядка - это вовсе не запах.
goat

Ответы:

194
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }
Андрей Атапин
источник
@justSaid, что ты имеешь в виду? Вы хотите таким же образом отсортировать поля элементов списка?
Андрей Атапин
5

Знаете ли вы, что есть удобный способ указать алфавитный порядок?

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

Если у вас есть особые требования, вот как вы можете настроить индивидуальный заказ:

@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }
naXa
источник
3

Ты можешь использовать @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder требуется добавить новую банку.

user1001
источник
3
@JsonPropertyOrder не требует новой банки, потому что, если вы используете jackson, она уже включена.
Патрик
1
Это зависит от фреймворка, который вы используете. Если вы не используете jackson, тогда лучше использовать вышеуказанную реализацию, которая будет применяться как для json, так и для xml, и не требует дополнительной настройки, если вы хотите возвращать данные в формате xml
user1001
Да, но вопрос был задан через Джексона. Если вы хотите предложить решение без использования Джексона, вы должны быть более конкретными в своем ответе.
Патрик