Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 即使数组中只有一个元素,如何强制抛弃编写数组?_Arrays_Xml_Jettison - Fatal编程技术网

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

那么,你最终能解决这个问题吗?没有。我最终用杰克逊取代了《抛弃》。