Jackson's ObjectMapper kullanarak JSON nesnelerinin sırası


92

Java-json eşlememi yapmak için ObjectMapper kullanıyorum .

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

bu benim java sınıfım:

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;
}

}

bu benim aldığım:

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

Şimdi sorum şu, bu json çıktısını nasıl alabilirim:

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

  }

Java beyannamemdeki ile aynı sırada olmasını istiyorum. Bunu belirtmenin bir yolu var mı? Belki ek açıklamalar veya bunun gibi şeylerle?


2
Mülk düzeninin önemli olması bir kod / tasarım kokusuna işaret eder. JSON'u tüketen ne olursa olsun, siparişi önemsememelidir (listeler evet, özellikler hayır).
ach

26
Okunabilirlik uğruna buna ihtiyacım var :-)
justSaid

11
@ach bu sadece doğru değil. Sıralı bir harita, çok yaygın ve çok kullanışlı bir veri türüdür. Arzulamak bir koku değildir.
keçi

Yanıtlar:


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

@justSaid, ne demek istiyorsun? Liste öğelerinin alanlarını da aynı şekilde sıralamak istiyor musunuz?
Andrey Atapin

5

Alfabetik sıralamayı belirlemenin uygun bir yolu olduğunu biliyor musunuz?

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

Özel gereksinimleriniz varsa, burada özel sıralamayı nasıl yapılandırırsınız:

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

3

Kullanabilirsiniz @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder yeni bir kavanozun eklenmesini gerektirir.


3
@JsonPropertyOrder yeni bir jar gerektirmez çünkü jackson kullanıyorsanız zaten dahil edilmiştir.
Patrick

1
Bu, kullandığınız çerçeveye bağlıdır. Jackson kullanmıyorsanız, hem json hem de xml için geçerli olacak ve xml biçiminde veri döndürmek istiyorsanız ekstra yapılandırmaya gerek kalmayacak olan yukarıdaki uygulamayla gitmek daha iyidir
user1001

Evet, ama soru Jackson kullanılarak soruldu. Jackson kullanmadan bir çözüm sağlamak istiyorsanız, cevabınızda daha spesifik olmalısınız.
Patrick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.