Orden de objetos JSON usando ObjectMapper de Jackson

92

Estoy usando ObjectMapper para hacer mi mapeo java-json.

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

esta es mi clase de 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;
}

}

esto es lo que obtengo:

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

Entonces mi pregunta ahora es, ¿cómo puedo obtener esta salida 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" : ""
    } ]

  }

Lo quiero con el mismo orden que en mi declaración de Java. ¿Hay alguna forma de especificarlo? ¿Quizás con anotaciones o cosas así?

sólo dije
fuente
2
El orden de la propiedad es significativo y apunta a un olor a código / diseño. Lo que sea que consuma JSON no debería preocuparse por el orden (enumera sí, propiedades no).
ach
26
Solo lo necesito en aras de la legibilidad :-)
justSaid
11
@ach eso no es cierto. Un mapa ordenado es un tipo de datos muy común y muy útil. Desear el orden no es un olor en absoluto.
cabra

Respuestas:

194
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }
Andrey Atapin
fuente
@justSaid, ¿qué quieres decir? ¿Desea ordenar los campos de los elementos de la lista de la misma manera?
Andrey Atapin
5

¿Sabe que existe una forma conveniente de especificar el orden alfabético?

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

Si tiene requisitos específicos, a continuación, le mostramos cómo configurar los pedidos personalizados:

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

Puedes usar @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder requiere que se agregue un nuevo frasco.

user1001
fuente
3
@JsonPropertyOrder no requiere un nuevo jar porque si usa jackson ya está incluido.
Patrick
1
Depende del marco que esté utilizando.Si no usa jackson, entonces es mejor ir con la implementación anterior que se aplicará tanto para json como para xml y no necesita configuración adicional si desea devolver datos en formato xml
user1001
Sí, pero la pregunta se hizo mediante jackson. Si desea proporcionar una solución sin usar jackson, debe ser más específico en su respuesta.
Patrick