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í?


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

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

3

Puedes usar @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder requiere que se agregue un nuevo frasco.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.