杰克逊为什么在某些JSON属性中添加@以及如何防止它?

时间:2016-03-10 17:34:59

标签: java json jackson jax-rs

我在Java中使用Jackson从REST端点返回JSON响应。这是生成的示例响应:

{"StatusCode":{"@statusCode":"OK"},"SomeElements":null}

问题:

  1. 杰克逊为什么要加入@ in?
  2. 如何阻止它添加?
  3. 注意:这个问题与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();
    }
    

1 个答案:

答案 0 :(得分:4)

你的类路径上可能有jettison,它的提供者用于序列化而不是杰克逊。

默认情况下,Jettison会使用'@'为映射到属性的属性添加前缀。

请参阅https://github.com/FasterXML/jackson-core/issues/114