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

时间:2013-10-09 13:01:35

标签: java json jackson

我正在使用 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声明中的顺序相同。有没有办法指定它?也许有注释或类似的东西?

5 个答案:

答案 0 :(得分:155)

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

答案 1 :(得分:5)

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

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

如果有特殊要求,请按以下步骤配置自定义订购:

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

答案 2 :(得分:2)

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

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

@JsonPropertyOrder需要添加一个新jar。

答案 3 :(得分:1)

生成的 .class 中字段的顺序是不确定的,因此您不能指望这一点。

如果您想对每个班级进行特定排序,那么您需要使用其他答案中指定的方法之一。

如果您希望所有内容都默认按字母顺序排列(例如,为了 JSON 结构的一致性),那么您可以像这样配置 ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
mapper.setConfig(mapper.getSerializationConfig()
   .with(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY));

为了更一致的 JSON,还考虑添加:

   .with(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS)

这种方法的一个优点是您不必修改每个被序列化的类。

答案 4 :(得分:1)

我今天发现了第三种方法,以防字母不是您想要的排序顺序。事实证明,在字段上添加 @JsonProperty 注释时会将其放在最后。我发现当我想指定一个不符合java命名约定的属性名称时。

通过添加索引属性,您可以定义顺序。最低的索引放在最前面。

@JsonProperty(index=20)
String prop1;

@JsonProperty(index=10)
String prop2;

将呈现:

{"prop2": "valueProp2", "prop1": "valueProp1"}