Ordem de objetos JSON usando ObjectMapper de Jackson

91

Estou usando o ObjectMapper para fazer meu mapeamento java-json.

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

esta é minha 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;
}

}

isso é o que eu recebo:

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

Minha pergunta agora é: como posso obter essa saída 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" : ""
    } ]

  }

Eu quero isso com a mesma ordem da minha declaração java. Existe uma maneira de especificá-lo? Talvez com anotações ou coisas assim?

acabei de falar
fonte
2
A ordem da propriedade sendo pontos significativos para um cheiro de código / design. O que quer que esteja consumindo o JSON não deve se preocupar com a ordem (listas sim, propriedades não).
ach
24
Eu só preciso disso para
facilitar a
10
@ach isso não é verdade. Um mapa ordenado é um tipo de dados muito comum e muito útil. Desejar ordem não é um cheiro.
cabra

Respostas:

192
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }
Andrey Atapin
fonte
@justSaid, o que você quer dizer? Você deseja classificar os campos dos elementos da lista da mesma maneira?
Andrey Atapin,
4

Você sabe que existe uma maneira conveniente de especificar a ordem alfabética?

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

Se você tiver requisitos específicos, veja como configurar pedidos personalizados:

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

Você pode usar @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder requer que um novo jarro seja adicionado.

user1001
fonte
3
@JsonPropertyOrder não requer um novo jar porque se você usar jackson, ele já estará incluído.
Patrick
1
Depende da estrutura que você está usando. Se você não usa jackson, então é melhor ir com a implementação acima, que se aplicará a json e xml e não precisa de configuração extra se você quiser retornar dados no formato xml
user1001
Sim, mas a pergunta foi feita usando jackson. Se você deseja fornecer uma solução sem usar jackson, você deve ser mais específico em sua resposta.
Patrick