我使用Jersey创建了一个简单的RESTful API服务,它向用户返回一个JSON。
但问题是JSON格式不正确。我想要
{
"x" : 1,
"y" : 2,
"result" : 3
}
但是得到
{
"x" : 1,
"result" : 3,
"y" : 2
}
这是我的DTO
@XmlRootElement(name = "result")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"x", "y", "res"})
public class Result {
private Long x;
private Long y;
private Long res;
// getters/setters ommited
}
如何在JSON响应中设置正确的顺序?
答案 0 :(得分:1)
因此@XmlType.propOrder
应该像@JsonPropertyOrder
一样工作(由我自己测试,如上所述[{3}}和here,给定在提供程序上启用了JAXB注释支持。
[barbara - 来自评论]:Fasterxml Jackson,
jersey-media-json-jackson
以下列出了我可以想到的原因,无法工作的原因。首先请记住,上面提到的模块有两个不同的提供商,JacksonJsonProvider
和JacksonJaxbJsonProvider
。我希望通过名称可以猜出哪一个提供了JAXB注释支持。
您明确注册了JacksonJsonProvider
您正在使用类路径扫描,它将注册两个提供程序,并在请求期间使用JacksonJsonProvider
。请记住,类路径扫描和包扫描是不同的。可以使用空Application
子类
@ApplicationPath("/api")
public class AppConfig extends Application {}
您可以在类路径上jersey-media-moxy
,默认提供商,除非已禁用,否则将在jersey-media-json-jackson
提供商上使用。
有些注意事项可能会有所帮助
如果您使用的是Jersey 2.9+,只需在类路径上使用jersey-media-json-jackson:2.9+
,就应该自动注册使用JacksonFeature
的{{1}}。版本2.8-,您可以在JacksonJaxbJsonProvider
JacksonFeature
ResourceConfig
或者如果您使用的是web.xml,请将该功能设置为Jersey servlet的初始参数
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("packages.to.scan");
register(JacksonFeature.class);
}
}
希望这能为您提供足够的信息来解决问题。