【发布时间】:2013-10-16 20:37:21
【问题描述】:
我正在使用 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 声明中的顺序相同。有没有办法指定它?也许带有注释或类似的东西?
【问题讨论】:
-
属性顺序很重要表明代码/设计气味。任何消费 JSON 的东西都不应该关心顺序(列出是,属性不是)。
-
为了可读性我只需要它:-)
-
@ach 这不是真的。有序映射是一种非常常见且非常有用的数据类型。想要秩序根本不是气味。
-
不,它不是代码/设计的味道。考虑一个您签署/验证 json 数据的 scrnario。
-
@Honza Zidek 我的评论是 7 年前的,但我只能想象它是针对互操作性的(第二句支持作为评论的目的)。我仍然坚持这一点——JSON 规范没有提供属性排序要求是有原因的,JSON 模式 AFAIR 也没有。为了可读性而排序的属性是合理的。