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