Dav*_*lla 17 xml arrays jettison
通过以下简化示例:
我按预期得到以下内容:
{"person":{"name":"john","tags":["tag1","tag2"]}}
Run Code Online (Sandbox Code Playgroud)
但是,如果我只设置一个标签,我会得到这个:
{"person":{"name":"john","tags":"tag1"}}
Run Code Online (Sandbox Code Playgroud)
我期待得到这个:
{"person":{"name":"john","tags":["tag1"]}}
Run Code Online (Sandbox Code Playgroud)
也就是说,jettison删除了标签的数组,因为数组中只有一个元素.
我觉得这很不安全.
即使只有一个元素,如何强制jettison写一个数组?
注意:我知道还有其他替代方法,例如StAXON.但是,我在这里问如何使用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>();
}
Run Code Online (Sandbox Code Playgroud)
我发现了这个:https://blogs.oracle.com/japod/entry/missing_brackets_at_json_one
似乎在上下文解析器中添加一行以明确声明它tags是一个数组是执行此操作的方法;IE
props.put(JSONJAXBContext.JSON_ARRAYS, "[\\"tags\\"]");
Run Code Online (Sandbox Code Playgroud)
注意:我对 Jetison 不熟悉,所以没有个人经验来支持这一点;仅上述博客文章中的信息。
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
828 次 |
| 最近记录: |