Ordre des objets JSON à l'aide de l'ObjectMapper de Jackson

91

J'utilise ObjectMapper pour faire mon mappage java-json.

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

c'est ma classe 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;
}

}

voici ce que je reçois:

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

Donc ma question est maintenant, comment puis-je obtenir cette sortie 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" : ""
    } ]

  }

Je le veux avec le même ordre que dans ma déclaration java. Existe-t-il un moyen de le spécifier? Peut-être avec des annotations ou des trucs comme ça?

juste dit
la source
2
L'ordre des propriétés étant significatif indique une odeur de code / design. Tout ce qui consomme le JSON ne devrait pas se soucier de l'ordre (liste oui, propriétés non).
ach
24
J'en ai juste besoin pour des raisons de lisibilité :-)
vient de dire
10
@ach ce n'est tout simplement pas vrai. Une carte ordonnée est un type de données très courant et très utile. L'ordre souhaité n'est pas du tout une odeur.
chèvre

Réponses:

192
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }
Andrey Atapin
la source
@justSaid, que voulez-vous dire? Voulez-vous trier les champs des éléments de liste de la même manière?
Andrey Atapin
4

Savez-vous qu'il existe un moyen pratique de spécifier l'ordre alphabétique?

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

Si vous avez des exigences spécifiques, voici comment configurer la commande personnalisée:

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

Vous pouvez utiliser @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder nécessite l'ajout d'un nouveau pot.

user1001
la source
3
@JsonPropertyOrder ne nécessite pas de nouveau fichier jar car si vous utilisez jackson, il est déjà inclus.
Patrick
1
Cela dépend du framework que vous utilisez.Si vous n'utilisez pas jackson, il est préférable d'utiliser l'implémentation ci-dessus qui s'appliquera à la fois pour json et xml et pas besoin de configuration supplémentaire si vous souhaitez renvoyer des données au format xml
user1001
Oui, mais la question a été posée en utilisant jackson. Si vous voulez fournir une solution sans utiliser jackson, vous devez être plus précis dans votre réponse.
Patrick