2010-07-14 5 views
8

Ich verwende die JAXB, die Teil der Jersey JAX-RS ist. Wenn ich JSON für meinen Ausgabetyp anfordere, beginnen alle meine Attributnamen mit einem Stern wie diesem,Warum werden Namen mit @ in JSON mit Hilfe von Jersey zurückgegeben

Dieses Objekt;

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

wird dies,

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

Also, warum gibt es @ im Namen?

Antwort

9

Alle mit @XmlAttribute zugeordneten Eigenschaften erhalten in JSON das Präfix '@'. Wenn Sie es entfernen möchten, haben Sie einfach Ihre Eigenschaft mit @XmlElement versehen.

Vermutlich ist dies potenzielle Namenskonflikte zu vermeiden:

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

Es funktioniert nicht für mich! mit '@ XmlAttribute' erhalte ich @ vor Feldern und mit' @ XmlElement' bekomme ich keine Ausgabe! – sajjadG

1

Wenn Sie zu XML und JSON werden Rangier-, und Sie müssen es nicht als Attribut in der XML-Version dann zu verwenden Vorschlag @XmlElement ist der beste Weg zu gehen.

Wenn es jedoch ein Attribut (anstatt ein Element) in der XML-Version sein muss, haben Sie eine ziemlich einfache Alternative.

Sie können einfach einen JSONConfiguration einrichten, der das Einfügen des "@" deaktiviert.

Es würde wie folgt aussehen:

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

Es gibt auch einige andere Alternativen Dokument hier:

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

+0

Die Verbindung ist unterbrochen. und ich habe die neueste Trikot-Dokumentation überprüft und es ist nichts über 'JSONConfiguration' drin! – sajjadG

0

Sie haben JSON_ATTRIBUTE_PREFIX in Ihrer JAXBContext Konfiguration auf "" die standardmäßig ist :

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