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?


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

@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 { ... }

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.