Why are names returned with @ in JSON using Jersey

大憨熊 提交于 2019-12-21 10:10:12

问题


I am using the JAXB that is part of the Jersey JAX-RS. When I request JSON for my output type, all my attribute names start with an asterisk like this,

This object;

package com.ups.crd.data.objects;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;

@XmlType
public class ResponseDetails {
    @XmlAttribute public String ReturnCode = "";
    @XmlAttribute public String StatusMessage = "";
    @XmlAttribute public String TransactionDate ="";
}

becomes this,

   {"ResponseDetails":{"@transactionDate":"07-12-2010",  
             "@statusMessage":"Successful","@returnCode":"0"}

So, why are there @ in the name?


回答1:


Any properties mapped with @XmlAttribute will be prefixed with '@' in JSON. If you want to remove it simply annotated your property with @XmlElement.

Presumably this is to avoid potential name conflicts:

@XmlAttribute(name="foo") public String prop1;  // maps to @foo in JSON
@XmlElement(name="foo") public String prop2;  // maps to foo in JSON



回答2:


If you are marshalling to both XML and JSON, and you don't need it as an attribute in the XML version then suggestion to use @XmlElement is the best way to go.

However, if it needs to be an attribute (rather than an element) in the XML version, you do have a fairly easy alternative.

You can easily setup a JSONConfiguration that turns off the insertion of the "@".

It would look something like this:

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;

public JAXBContextResolver() throws Exception {
    this.context=   new JSONJAXBContext(
        JSONConfiguration
            .mapped()
            .attributeAsElement("StatusMessage",...)
            .build(), 
            ResponseDetails.class); 
}

@Override
public JAXBContext getContext(Class<?> objectType) {
    return context;
}
}

There are also some other alternatives document here:

http://jersey.java.net/nonav/documentation/latest/json.html




回答3:


You have to set JSON_ATTRIBUTE_PREFIX in your JAXBContext configuration to "" which by default is "@":

properties.put(JAXBContextProperties.JSON_ATTRIBUTE_PREFIX, ""); 


来源:https://stackoverflow.com/questions/3249956/why-are-names-returned-with-in-json-using-jersey

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!