使用Jackson的ObjectMapper的JSON对象的顺序


91

我正在使用ObjectMapper进行java-json映射。

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

这是我的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;
}

}

这就是我得到的:

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

所以我现在的问题是,如何获得此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" : ""
    } ]

  }

我想要的顺序与我的Java声明中的顺序相同。有没有办法指定它?也许带有注释或类似的东西?


2
属性顺序很重要,它表明了代码/设计的味道。不管使用什么JSON,都不关心顺序(列出是,属性否)。
2013年

24
为了可读性我只需要它:-)
justSaid

10
@ach这不是真的。有序映射是一种非常常见且非常有用的数据类型。想要命令根本不是一种气味。
山羊

Answers:



4

您知道有一种方便的方法来指定字母顺序吗?

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

如果有特定要求,请在此处配置自定义订购的方式:

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

3

您可以使用 @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder 需要添加一个新的jar。


3
@JsonPropertyOrder不需要新的jar,因为如果您使用jackson,则它已经包含在内。
帕特里克

1
这取决于您使用的框架。如果您不使用jackson,那么最好采用上述实现,该实现将同时适用于json和xml,并且如果您想返回xml格式的数据,则无需进行额外配置
user1001

是的,但是使用杰克逊提出了问题。如果您想在不使用杰克逊的情况下提供解决方案,则答案必须更加具体。
帕特里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.