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>();
}