2010-07-14 14 views
8

J'utilise le JAXB qui fait partie du Jersey JAX-RS. Lorsque je demande JSON pour mon type de sortie, tous mes noms d'attribut commencent par un astérisque comme celui-ci,Pourquoi les noms sont retournés avec @ dans JSON en utilisant Jersey

Cet objet;

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

devient ce,

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

Alors, pourquoi sont là @ au nom?

Répondre

9

Toutes les propriétés mappées avec @XmlAttribute seront préfixées avec '@' dans JSON. Si vous voulez l'enlever, il suffit d'annoter votre propriété avec @XmlElement.

On peut supposer que cela est d'éviter les conflits de noms potentiels:

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

Ça ne marche pas pour moi! avec '@ XmlAttribute' je reçois @ avant les champs et avec' @ XmlElement' je n'obtiens aucune sortie! – sajjadG

1

Si vous rassemblons à la fois XML et JSON, et vous n'avez pas besoin comme un attribut dans la version XML puis suggestion d'utiliser @XmlElement est le meilleur moyen d'y aller. Toutefois, s'il doit s'agir d'un attribut (plutôt que d'un élément) dans la version XML, vous disposez d'une alternative assez simple.

Vous pouvez facilement configurer un JSONConfiguration qui désactive l'insertion du "@".

Il ressemblerait à quelque chose comme ceci:

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

Il y a aussi d'autres solutions de rechange documents ici:

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

+0

Le lien est rompu. et j'ai vérifié la dernière documentation de jersey et il n'y a rien à propos de 'JSONConfiguration' dedans! – sajjadG

0

Vous devez définir JSON_ATTRIBUTE_PREFIX dans votre configuration JAXBContext à "" qui, par défaut est "@":

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