gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:39:46 26 4
gpt4 key购买 nike

使用下面的简化示例:

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

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

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

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

我期待得到这个:

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

即jettison去掉了tags数组,因为数组中只有一个元素。

我认为这很不安全。

即使只有一个元素,如何强制 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>();
}

最佳答案

我找到了这个: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;
}

}

关于arrays - 如何强制 jettison 写一个数组,即使数组中只有一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13805871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com