Como eu organizo listas aninhadas como JSON usando Jersey? Eu recebo uma matriz de nulos ou uma matriz de dicionários de um elemento contendo uma matriz

Estou trabalhando em um projeto que usa Jersey para converter objetos em JSON. Eu gostaria de poder escrever listas aninhadas, assim:

{"data":[["one", "two", "three"], ["a", "b", "c"]]}

O objeto que eu gostaria de converter primeiro representava dados como um <LinkedList <LinkedList <String >>>, e imaginei que Jersey faria a coisa certa. O acima foi produzido como uma lista de nulos:

{"data":[null, null]}

Depois de ler que os objetos aninhados precisam ser quebrados, tentei o seguinte:

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

Esse código mostra o que está abaixo, o que está mais próximo do que eu quero:

{"data":[{"data":["one", "two", "three"]},{"data":["a", "b", "c"]}]}

Eu quero que os primeiros dados sejam uma lista de listas, não uma lista de dicionários de um elemento. Como faço para conseguir isso?

Aqui está o meu 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;
    }
}

questionAnswers(3)

yourAnswerToTheQuestion