2011-04-05 6 views
2

j'ai un service web simple maillot et je voudrais consommer/produire des objets qui contiennent des champs de carte, comme(+ jackson) Champ carte sérialisation

@XmlElement 
private Map<String,String> properties; 

si cette chaîne va dans le service Web,

{ properties: { key1: val1, key2: val2)} 

le champ de propriétés est désérialisé en tant que null sans erreurs. le même JSON entre et sans problème dans GSON, et à court terme, j'ai résolu ce problème en faisant consommer des maillots et en utilisant GSON pour sérialiser/désérialiser le JSON.

des idées? merci.

+0

Jamais entendu parler de JSON? Vous venez de le recréer;) Bien que vous l'ayez étiqueté comme tel ... quelle est la question, exactement? Il existe un certain nombre de parseurs JSON pour Java. –

+4

Veuillez ne pas insulter les gens. Cela ne vous mènera pas très loin. –

+0

@BrianRoach Si vous avez bien lu la question, Jeffrey a mentionné le terme «GSON». Gson est une bibliothèque Java qui peut être utilisée pour convertir des objets Java en leur représentation JSON. Donc, la question ici est un peu plus sophistiquée que de sortir un analyseur JSON d'une recherche Google et l'utiliser. –

Répondre

0

Jersey utilise JAXB pour la sérialisation . JAXB ne peut pas sérialiser une carte car il n'y a pas de type XML pour le type de carte Java. De plus, Map est une interface et JAXB n'aime pas les interfaces. Si vous utilisez JAXBJackson bridge pour marshal, vous rencontrerez un problème.

Vous devez créer un adaptateur comme ci-dessous et annoter votre propriété Carte avec

@XmlJavaTypeAdapter(MapAdapter.class) 
private Map<String,String> properties; 

@XmlSeeAlso({ Adapter.class, MapElement.class }) 
public class MapAdapter<K,V> extends XmlAdapter<Adapter<K,V>, Map<K,V>>{ 


    @Override 
    public Adapter<K,V> marshal(Map<K,V> map) throws Exception { 

    if (map == null) 
     return null; 

    return new Adapter<K,V>(map); 
    } 


    @Override 
    public Map<K,V> unmarshal(Adapter<K,V> adapter) throws Exception { 
    throw new UnsupportedOperationException("Unmarshalling a list into a map is not supported"); 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name="Adapter", namespace="MapAdapter") 
    public static final class Adapter<K,V>{ 

    List<MapElement<K,V>> item; 

    public Adapter(){} 

    public Adapter(Map<K,V> map){ 
     item = new ArrayList<MapElement<K,V>>(map.size()); 
     for (Map.Entry<K, V> entry : map.entrySet()) { 
     item.add(new MapElement<K,V>(entry)); 
     }  
    } 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name="MapElement", namespace="MapAdapter") 
    public static final class MapElement<K,V>{ 

    @XmlAnyElement 
    private K key; 

    @XmlAnyElement 
    private V value; 

    public MapElement(){}; 

    public MapElement(K key, V value){ 
     this.key = key; 
     this.value = value; 
    } 

    public MapElement(Map.Entry<K, V> entry){ 
     key = entry.getKey(); 
     value = entry.getValue(); 
    } 

    public K getKey() { 
     return key; 
    } 

    public void setKey(K key) { 
     this.key = key; 
    } 

    public V getValue() { 
     return value; 
    } 

    public void setValue(V value) { 
     this.value = value; 
    } 


    } 

} 
+0

merci. Je suis passé à utiliser GSON à ce stade, mais de bonnes informations. –

1

Une option consiste à utiliser des classes annotées. Ainsi, par exemple, un utilisateur peut être représenté par les données suivantes.

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "user") 
public class User { 
    private int uid; 
    public int user_id; 
    public String user_name; 
    public String email; 
    public URI image_url; 
    public List<User> friends; 
    public boolean admin; 

    public User() { 
     ... 
    } 
    public User(final int userid) { 
     // Find user by id 
    } 
} 

Si vous retournez l'objet utilisateur comme dans le morceau de code suivant, puis JAXB automatiquement sérialiser la liste comme une liste de JSON, etc etc ....

@GET 
@Path("/{userid}") 
@Produces("application/json", "application/xml") 
    public User showUser(@PathParam("userid") final int userid) { 
     return new User(userid); 
} 
+0

merci mais la question est sur la façon de passer correctement un objet avec un champ de carte. jersey + jackson ne veut pas sérialiser/désérialiser cela. Je vais essayer d'éditer la question pour la rendre plus claire. –

+0

Vous voulez dire passer dans un type d'objet? Jersey + Jackson ne peut pas gérer cela. Vous devez définir les valeurs de l'objet. –

+0

bien ... non. l'objet java à sérialiser/désérialiser a simplement un champ qui est une carte. –

Questions connexes