arrays xml jettison

arrays - ¿Cómo forzar a Jettison a escribir una matriz, incluso si solo hay un elemento en la matriz?



xml (1)

Encontré esto: https://blogs.oracle.com/japod/entry/missing_brackets_at_json_one

Parece que agregar una línea a su resolución de contexto para indicar explícitamente que las tags es una matriz es la forma de hacerlo; es decir

props.put(JSONJAXBContext.JSON_ARRAYS, "[//"tags//"]");

NB: No estoy familiarizado con Jettison, por lo que no tengo experiencia personal que respalde esto; Sólo la información en la publicación del blog anterior.

@Provider public class JAXBContextResolver implements ContextResolver<JAXBContext> { private JAXBContext context; private Class[] types = {ArrayWrapper.class}; public JAXBContextResolver() throws Exception { Map props = new HashMap<String, Object>(); props.put(JSONJAXBContext.JSON_NOTATION, "MAPPED"); props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE); props.put(JSONJAXBContext.JSON_ARRAYS, "[//"tags//"]"); //STATE WHICH ELEMENT IS AN ARRAY this.context = new JSONJAXBContext(types, props); } public JAXBContext getContext(Class<?> objectType) { return (types[0].equals(objectType)) ? context : null; } }

Con el siguiente ejemplo simplificado:

Me sale lo siguiente, como es de esperar:

{"person":{"name":"john","tags":["tag1","tag2"]}}

Sin embargo, si solo establezco una etiqueta, obtengo esto:

{"person":{"name":"john","tags":"tag1"}}

Y esperaba conseguir esto:

{"person":{"name":"john","tags":["tag1"]}}

Es decir, Jettison ha eliminado la matriz para las etiquetas, porque solo hay un elemento en la matriz.

Creo que esto es bastante inseguro.

¿Cómo forzar a Jettison a escribir una matriz, incluso si solo hay un elemento?

Nota: soy consciente de que existen otras alternativas a la eliminación, como StAXON. Sin embargo, aquí estoy preguntando cómo lograr esto utilizando Jettison. Por favor, no sugiera otra alternativa a jettison.

import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.*; import java.io.*; import javax.xml.bind.*; import javax.xml.stream.XMLStreamWriter; import org.codehaus.jettison.mapped.*; public class JettisonTest { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Person.class); Person person = new Person(); person.name = "john"; person.tags.add("tag1"); person.tags.add("tag2"); Configuration config = new Configuration(); MappedNamespaceConvention con = new MappedNamespaceConvention(config); Writer writer = new OutputStreamWriter(System.out); XMLStreamWriter xmlStreamWriter = new MappedXMLStreamWriter(con, writer); Marshaller marshaller = jc.createMarshaller(); marshaller.marshal(person, xmlStreamWriter); } } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Person { String name; List<String> tags = new ArrayList<String>(); }