Comment puis-je le maréchal des listes imbriquées comme JSON à l'aide de Jersey? Je obtenir un tableau de valeurs null ou un tableau d'un élément dictionnaires contenant un tableau
Je suis en train de travailler sur un projet qui utilise Jersey pour convertir les objets JSON. J'aimerais être capable d'écrire des listes imbriquées, comme suit:
{"data":[["one", "two", "three"], ["a", "b", "c"]]}
L'objet que j'aimerais convertir en première représente les données en tant que <LinkedList<LinkedList<String>>>, et j'ai pensé que Jersey voudrais juste faire la bonne chose. Le ci-dessus a été sortie en tant que liste de valeurs null:
{"data":[null, null]}
Après avoir lu que des objets imbriqués ont besoin d'être enveloppé, j'ai essayé le suivant:
@XmlRootElement(name = "foo")
@XmlType(propOrder = {"data"})
public class Foo
{
private Collection<FooData> data = new LinkedList<FooData>();
@XmlElement(name = "data")
public Collection<FooData> getData()
{
return data;
}
public void addData(Collection data)
{
FooData d = new FooData();
for(Object o: data)
{
d.getData().add(o == null ? (String)o : o.toString());
}
this.data.add(d);
}
@XmlRootElement(name = "FooData")
public static class FooData
{
private Collection<String> data = new LinkedList<String>();
@XmlElement
public Collection<String> getData()
{
return data;
}
}
}
Que le code de sorties de ce qui est ci-dessous, qui est plus proche de ce que je veux:
{"data":[{"data":["one", "two", "three"]},{"data":["a", "b", "c"]}]}
Je veux que le premier des données d'une liste de listes, pas une liste d'un élément de dictionnaires. Comment puis-je y parvenir?
Voici mon JAXBContentResolver:
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext>
{
private JAXBContext context;
private Set<Class<?>> types;
//Only parent classes are required here. Nested classes are implicit.
protected Class<?>[] classTypes = new Class[] {Foo.class};
protected Set<String> jsonArray = new HashSet<String>(1) {
{
add("data");
}
};
public JAXBContextResolver() throws Exception
{
Map<String, Object> props = new HashMap<String, Object>();
props.put(JSONJAXBContext.JSON_NOTATION, JSONJAXBContext.JSONNotation.MAPPED);
props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE);
props.put(JSONJAXBContext.JSON_ARRAYS, jsonArray);
this.types = new HashSet<Class<?>>(Arrays.asList(classTypes));
this.context = new JSONJAXBContext(classTyes, props);
}
public JAXBContext getContext(Class<?> objectType)
{
return (types.contains(objectType)) ? context : null;
}
}
OriginalL'auteur | 2009-07-17
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé de jersey-json ??
Ajouter jersey-json à votre classpath (ou vos dépendances maven)
Puis utilisez ceci :
Vous avez seulement besoin de quelque chose comme cela dans vos ressources (en supposant que DetailProduit est votre objet à sérialiser et que DetailProduit.java est jaxb marqués et dans le paquet.de.votre.modèle)
OriginalL'auteur Arnaudweb
Découvrez "l'Amélioration de l'Application de" l'article de cette page:
http://blogs.oracle.com/enterprisetechtips/entry/configuring_json_for_restful_web
OriginalL'auteur anon
Je sais que la qustion est plutôt vieux, mais je suis tombé sur un problème similaire mais je voulais afficher une Liste de Tableaux ie.Liste en raison d'un résultat à partir d'une base que j'ai obtenu à partir de jpa et originaires de la requête, sans l'aide d'Entités.
C'est comment je l'ai résolu:
D'abord Créé un ListWrapper.java:
Et puis j'ai créé une classe étendant AbstractMessageReaderWriterProvider
Puis-je l'utiliser dans un comme ceci:
La méthode de recherche est de retour une Listwrapper avec une liste d'Object[]
Espère que cela aide quelqu'un 🙂
OriginalL'auteur Perty