2010-07-14 5 views
8

Sto utilizzando il JAXB che fa parte del JAX-RS di Jersey. Quando richiedo JSON per il mio tipo di output, tutti i nomi dei miei attributi iniziano con un asterisco come questo,Perché i nomi vengono restituiti con @ in JSON utilizzando Jersey

Questo oggetto;

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 =""; 
} 

diventa questo,

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

Allora, perché sono lì @ nel nome?

risposta

9

Qualsiasi proprietà mappata con @XmlAttribute verrà preceduta da '@' in JSON. Se vuoi rimuoverlo, annota semplicemente la tua proprietà con @XmlElement.

Presumibilmente questo è quello di evitare potenziali conflitti di nomi:

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

Non funziona per me! con '@ XmlAttribute' ottengo @ prima dei campi e con' @ XmlElement' non ottengo alcun output! – sajjadG

1

Se si smistamento sia XML e JSON, e non hanno bisogno come un attributo nella versione XML poi il suggerimento di usare @XmlElement è il modo migliore per andare.

Tuttavia, se deve essere un attributo (piuttosto che un elemento) nella versione XML, si dispone di un'alternativa abbastanza semplice.

È possibile impostare facilmente uno JSONConfiguration che disattiva l'inserimento di "@".

Sarebbe sembrare qualcosa di simile:

@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; 
} 
} 

ci sono anche qualche altro documento alternative qui:

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

+0

Il collegamento è interrotto. e ho controllato l'ultima documentazione sulla jersey e non c'è niente riguardo a 'JSONConfiguration'! – sajjadG

0

È necessario impostare JSON_ATTRIBUTE_PREFIX nella configurazione JAXBContext a "" che di default è "@":

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