117 votes

Ordre des objets JSON en utilisant l'ObjectMapper de Jackson

Je suis en train d'utiliser ObjectMapper pour faire la correspondance java-json.

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

voici ma classe java:

public class Relation {

private String id;
private String source;
private String target;
private String label;
private List 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 attributes) {
    this.attributes = attributes;
}

public List getAttributes() {
    return attributes;
}

}

voici ce que j'obtiens :

{
    "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 maintenant est, 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 dans le même ordre que dans ma déclaration java. Y a-t-il un moyen de le spécifier ? Peut-être avec des annotations ou des choses comme ça ?

243voto

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

would be translated to :

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

28voto

naXa Points 862

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

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

Si vous avez des exigences spécifiques, voici comment configurer un ordre personnalisé :

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

20voto

johncurrier Points 25

L'ordre des champs dans un .class généré est indéterminé, donc vous ne pouvez pas vous fier à cela.

Si vous voulez un ordre spécifique par classe, alors vous devrez utiliser l'une des approches spécifiées dans d'autres réponses.

Si vous voulez que tout soit par défaut en ordre alphabétique (par exemple, pour la cohérence dans la structure JSON), vous pouvez configurer l'ObjectMapper comme ceci :

ObjectMapper mapper = new ObjectMapper();
mapper.setConfig(mapper.getSerializationConfig()
   .with(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY));

Pour un JSON plus cohérent, envisagez également d'ajouter :

   .with(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS)

Un avantage de cette approche est que vous n'avez pas à modifier chaque classe en cours de sérialisation.

11voto

Rythmic Points 149

J'ai découvert une troisième manière aujourd'hui au cas où l'ordre alphabétique ne serait pas celui souhaité. Il s'avère qu'ajouter une annotation @JsonProperty sur un champ le place en dernier lors de l'écriture. J'ai découvert cela lorsque je voulais spécifier un nom de propriété qui ne respectait pas les conventions de nommage java.

En ajoutant un attribut index, vous pouvez définir l'ordre. L'index le plus bas est placé en premier.

@JsonProperty(index=20)
String prop1;

@JsonProperty(index=10)
String prop2;

Rendrait :

{"prop2": "valueProp2", "prop1": "valueProp1"}

2voto

Prasad Reddy Points 405

Vous pouvez utiliser @XmlAccessorType(XmlAccessType.FIELD)

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X