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?


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

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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.