即使数组中只有一个元素,如何强制jettison写入数组?

Posted

技术标签:

【中文标题】即使数组中只有一个元素,如何强制jettison写入数组?【英文标题】:how to force jettison to write an array, even if there is only one element in the array? 【发布时间】:2012-11-28 03:45:50 【问题描述】:

下面是简化的例子:

正如预期的那样,我得到了以下信息:

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

但是,如果我只设置一个标签,我会得到:

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

我期待得到这个:

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

也就是说,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>();

【问题讨论】:

那么你最终解决了这个问题吗? 没有。我最终用杰克逊取代了 Jettison。 【参考方案1】:

我发现了这个:https://blogs.oracle.com/japod/entry/missing_brackets_at_json_one

似乎在上下文解析器中添加一行以明确声明tags 是一个数组是执行此操作的方法;即

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

注意:我不熟悉 Jettison,因此没有个人经验来支持这一点;仅限上述博文中的信息。

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


【讨论】:

以上是关于即使数组中只有一个元素,如何强制jettison写入数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保方法返回一个数组,即使 Ruby 中只有一个元素

即使我只有一个参数,我也会收到“包装承诺不可迭代错误”

如何强制文本数组中的空格?

如何用js把字符串转化为整型

将元素的属性强制为某个值,即使它正在被动画化

在 Python 中,如何生成数组的排列,其中每一列和每一行只有一个元素?