为什么 Jackson 将 @ 添加到某些 JSON 属性以及如何防止它?
Why is Jackson Adding @ to Some JSON Attributes and How To Prevent It?
我在 Java 中使用 Jackson 来 return 来自 REST 端点的 JSON 响应。这是生成的示例响应:
{"StatusCode":{"@statusCode":"OK"},"SomeElements":null}
问题:
- Jackson 为什么要添加@?
- 如何阻止它添加?
注意:这个问题与 this 的不同之处在于我想知道为什么杰克逊要添加它以及如何防止它这样做,因为它会导致问题它将响应传递给的系统。
编辑:
这是经过清理的代码:
public enum StatusCodeType {
OK, WARNING, ERROR
}
@XmlType(name = "StatusResponse", namespace = "http://www.w3.org/2001/XMLSchema/<obfuscated>", propOrder = {"statusCode", "message"})
@XmlAccessorType(XmlAccessType.FIELD)
public class StatusResponse {
@XmlAttribute(name = "statusCode", required = true)
private StatusCodeType statusCode;
@XmlAttribute(name = "message")
private String message;
public StatusResponse(final StatusCodeType statusCode, final String message) {
this.statusCode = statusCode;
this.message = message;
}
public StatusResponse(final StatusCodeType statusCode) {
this.statusCode = statusCode;
}
public StatusResponse() {
}
public StatusCodeType getStatusCode() {
return statusCode;
}
public void setStatusCode(StatusCodeType statusCode) {
this.statusCode = statusCode;
}
public void setMessage(String message) {
this.message = message;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class SomeResponse {
@XmlElement(name = "StatusCode", required = true)
private StatusResponse statusResponse;
public StatusResponse getStatusResponse() {
return statusResponse;
}
public void setStatusResponse(StatusResponse statusResponse) {
this.statusResponse = statusResponse;
}
}
@XmlRootElement(name = "XmlResponse", namespace = "http://www.w3.org/2001/XMLSchema/<obfuscated>")
public class XmlResponse extends SomeResponse {
@XmlElement(name = "SomeElement")
@XmlElementWrapper(name = "SomeElements", required = true)
private List<SomeElement> someElements;
public List<SomeElement> getSomeElements() {
return someElements;
}
public void setSomeElements(List<SomeElement> someElements) {
this.someElements = someElements;
}
}
@Path("/getAll")
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getAll(@QueryParam("firstParam") String firstParam, @QueryParam("secondParam") String secondParam) {
...
final XmlResponse resp = processToXmlResponse(someObject);
return Response.ok().entity(resp).build();
}
您的类路径中可能有 jettison,它的提供程序用于序列化而不是 jackson。
默认情况下,Jettison 将为映射到属性的属性添加前缀“@”。
我在 Java 中使用 Jackson 来 return 来自 REST 端点的 JSON 响应。这是生成的示例响应:
{"StatusCode":{"@statusCode":"OK"},"SomeElements":null}
问题:
- Jackson 为什么要添加@?
- 如何阻止它添加?
注意:这个问题与 this 的不同之处在于我想知道为什么杰克逊要添加它以及如何防止它这样做,因为它会导致问题它将响应传递给的系统。
编辑:
这是经过清理的代码:
public enum StatusCodeType {
OK, WARNING, ERROR
}
@XmlType(name = "StatusResponse", namespace = "http://www.w3.org/2001/XMLSchema/<obfuscated>", propOrder = {"statusCode", "message"})
@XmlAccessorType(XmlAccessType.FIELD)
public class StatusResponse {
@XmlAttribute(name = "statusCode", required = true)
private StatusCodeType statusCode;
@XmlAttribute(name = "message")
private String message;
public StatusResponse(final StatusCodeType statusCode, final String message) {
this.statusCode = statusCode;
this.message = message;
}
public StatusResponse(final StatusCodeType statusCode) {
this.statusCode = statusCode;
}
public StatusResponse() {
}
public StatusCodeType getStatusCode() {
return statusCode;
}
public void setStatusCode(StatusCodeType statusCode) {
this.statusCode = statusCode;
}
public void setMessage(String message) {
this.message = message;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class SomeResponse {
@XmlElement(name = "StatusCode", required = true)
private StatusResponse statusResponse;
public StatusResponse getStatusResponse() {
return statusResponse;
}
public void setStatusResponse(StatusResponse statusResponse) {
this.statusResponse = statusResponse;
}
}
@XmlRootElement(name = "XmlResponse", namespace = "http://www.w3.org/2001/XMLSchema/<obfuscated>")
public class XmlResponse extends SomeResponse {
@XmlElement(name = "SomeElement")
@XmlElementWrapper(name = "SomeElements", required = true)
private List<SomeElement> someElements;
public List<SomeElement> getSomeElements() {
return someElements;
}
public void setSomeElements(List<SomeElement> someElements) {
this.someElements = someElements;
}
}
@Path("/getAll")
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getAll(@QueryParam("firstParam") String firstParam, @QueryParam("secondParam") String secondParam) {
...
final XmlResponse resp = processToXmlResponse(someObject);
return Response.ok().entity(resp).build();
}
您的类路径中可能有 jettison,它的提供程序用于序列化而不是 jackson。
默认情况下,Jettison 将为映射到属性的属性添加前缀“@”。