【发布时间】:2016-01-16 02:57:08
【问题描述】:
我目前正在使用 Spark 框架开发 RESTful 应用程序,并使用 Jackson 进行序列化。我遇到了这样的问题:@JsonPropertyOrder 被忽略。
这是我的 POJO:
@Data
@JsonPropertyOrder({"id", "company", "title", "infos", "startDate", "endDate"})
public class Info {
@JsonProperty("id")
long id;
@JsonProperty("company")
Company company;
@JsonProperty("title")
String title;
@JsonProperty("infos")
List<Prize> infos;
@JsonProperty("startDate")
Date startDate;
@JsonProperty("endDate")
Date endDate;
public Info() {}
}
我用这种方法生成 JSON:
public static String generateJSONResponse(Object response) {
if (responseObjectMapper == null) {
responseObjectMapper = new ObjectMapper(new JsonFactory());
responseObjectMapper.enable(SerializationFeature.INDENT_OUTPUT);
}
try {
return responseObjectMapper.writeValueAsString(response);
} catch (IOException ioe) {
// Must not occur
}
// Something really unexpected happened, so we return unknown response;
return ErrorMessages.ERROR_RESPONSE_UNKNOWN;
}
最后我收到了这个:
{
"status": 0,
"result": {
"infoList": [
{
"infos": [...],
"id": 2,
"title": "...",
"company": {...},
"startDate": 1445238000000,
"endDate": 1445792400000
},
...
]
}
}
我做错了什么?或者杰克逊有什么问题?有人可以帮我吗?
另外,我使用 Jackson 版本 2.6.3 和 2.3.5 进行了尝试。两者的工作方式相同。
【问题讨论】:
-
当我尝试使用 Jackson 2.6.2 复制您的代码时,它似乎工作正常。您的设置还有什么特别之处吗?
@Data注释是什么?也许它以某种方式干扰? -
请问,为什么要保留属性的顺序? The JSON spec 明确表示对象是一个无序集合“
An object is an unordered collection of zero or more name/value pairs, [...]”和“Implementations whose behavior does not depend onmember ordering will be interoperable in the sense that they will not be affected by these differences.” -
@Data注释是一个 Lombok 库注释,它使我不必为每个字段编写 getter 和 setter。我不知道它是否会以某种方式干扰,但我会调查一下。 -
关于我为什么需要它:只是为了让其他开发人员能够阅读 JSON。
-
据我测试,Lombok
@Data注释无论如何都不会影响排序。@JsonPropertyOrder仍然被忽略。