Arrays 即使数组中只有一个元素,如何强制抛弃编写数组?
使用下面的简化示例: 正如预期的那样,我得到了以下结果:Arrays 即使数组中只有一个元素,如何强制抛弃编写数组?,arrays,xml,jettison,Arrays,Xml,Jettison,使用下面的简化示例: 正如预期的那样,我得到了以下结果: {"person":{"name":"john","tags":["tag1","tag2"]}} 但是,如果我只设置了一个标记,我会得到以下结果: {"person":{"name":"john","tags":"tag1"}} {"person":{"name":"john","tags":["tag1"]}} 我希望得到这个: {"person":{"name":"john","tags":"tag1"}} {"person
{"person":{"name":"john","tags":["tag1","tag2"]}}
但是,如果我只设置了一个标记,我会得到以下结果:
{"person":{"name":"john","tags":"tag1"}}
{"person":{"name":"john","tags":["tag1"]}}
我希望得到这个:
{"person":{"name":"john","tags":"tag1"}}
{"person":{"name":"john","tags":["tag1"]}}
也就是说,因为数组中只有一个元素,所以抛弃已删除标记的数组
我觉得这很不安全
即使只有一个元素,如何强制放弃写入数组?
注:我知道有其他的选择抛弃,如斯塔克森。
然而,这里我想问的是如何使用抛弃来实现这一点。
请不要建议抛弃的其他替代方案
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>();
}
import java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.annotation.*;
导入java.io.*;
导入javax.xml.bind.*;
导入javax.xml.stream.XMLStreamWriter;
导入org.codehaus.jettison.mapped.*;
公共级抛掷试验{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Person.class);
Person=新人();
person.name=“约翰”;
人员。标签。添加(“标签1”);
人员。标签。添加(“标签2”);
配置配置=新配置();
MappedNamespaceConvention con=新的MappedNamespaceConvention(配置);
Writer Writer=新的输出流Writer(System.out);
XMLStreamWriter XMLStreamWriter=新MappedXMLStreamWriter(con,writer);
Marshaller=jc.createMarshaller();
马歇尔(个人,作家);
}
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
班主任{
字符串名;
列表标记=新的ArrayList();
}
我发现:
似乎在上下文解析器中添加一行来明确说明标记
是一个数组是实现这一点的方法;i、 e
props.put(JSONJAXBContext.JSON_ARRAYS, "[\\"tags\\"]");
注:我不熟悉抛弃,所以没有个人经验来支持这一点;只有上述博客帖子上的信息
@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;
}
}
@Provider
公共类JAXBContextResolver实现ContextResolver{
私有JAXBContext上下文;
私有类[]类型={ArrayWrapper.Class};
公共JAXBContextResolver()引发异常{
Map props=newhashmap();
put(JSONJAXBContext.JSON_表示法,“映射”);
put(JSONJAXBContext.JSON_ROOT_UNWRAPPING,Boolean.TRUE);
put(JSONJAXBContext.JSON_数组,“[\\\”标记\\“]”);//说明哪个元素是数组
this.context=新的JSONJAXBContext(类型、道具);
}
公共JAXBContext getContext(类objectType){
返回(类型[0]。等于(对象类型))?上下文:null;
}
}
那么,你最终能解决这个问题吗?没有。我最终用杰克逊取代了《抛弃》。