Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are names returned with @ in JSON using Jersey

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?

like image 734
John Avatar asked Jul 14 '10 19:07

John


2 Answers

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
like image 170
bdoughan Avatar answered Oct 29 '22 23:10

bdoughan


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

like image 28
DaBlick Avatar answered Oct 29 '22 21:10

DaBlick