gpt4 book ai didi

java - 如何使用 Jersey 将嵌套列表编码为 JSON?我得到一个空值数组或一个包含数组的单元素字典数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:07 27 4
gpt4 key购买 nike

我正在开发一个使用 Jersey 将对象转换为 JSON 的项目。我希望能够像这样写出嵌套列表:

{"data":[["one", "two", "three"], ["a", "b", "c"]]}

我想转换的对象首先将数据表示为 >>,我认为 Jersey 会做正确的事情。以上是作为空值列表输出的:

{"data":[null, null]}

在阅读到嵌套对象需要被包装后,我尝试了以下方法:

@XmlRootElement(name = "foo")
@XmlType(propOrder = {"data"})
public class Foo
{
private Collection<FooData> data = new LinkedList<FooData>();

@XmlElement(name = "data")
public Collection<FooData> getData()
{
return data;
}

public void addData(Collection data)
{
FooData d = new FooData();
for(Object o: data)
{
d.getData().add(o == null ? (String)o : o.toString());
}
this.data.add(d);
}

@XmlRootElement(name = "FooData")
public static class FooData
{
private Collection<String> data = new LinkedList<String>();

@XmlElement
public Collection<String> getData()
{
return data;
}
}
}

该代码输出以下内容,更接近我想要的内容:

{"data":[{"data":["one", "two", "three"]},{"data":["a", "b", "c"]}]}

我希望第一个数据是列表的列表,而不是单元素字典的列表。我如何实现这一目标?

这是我的 JAXBContentResolver:

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext>
{
private JAXBContext context;
private Set<Class<?>> types;

// Only parent classes are required here. Nested classes are implicit.
protected Class<?>[] classTypes = new Class[] {Foo.class};

protected Set<String> jsonArray = new HashSet<String>(1) {
{
add("data");
}
};

public JAXBContextResolver() throws Exception
{
Map<String, Object> props = new HashMap<String, Object>();
props.put(JSONJAXBContext.JSON_NOTATION, JSONJAXBContext.JSONNotation.MAPPED);
props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE);
props.put(JSONJAXBContext.JSON_ARRAYS, jsonArray);
this.types = new HashSet<Class<?>>(Arrays.asList(classTypes));
this.context = new JSONJAXBContext(classTyes, props);
}

public JAXBContext getContext(Class<?> objectType)
{
return (types.contains(objectType)) ? context : null;
}
}

最佳答案

你试过 jersey-json 了吗??

将 jersey-json 添加到你的类路径(或你的 maven 依赖项)

然后使用这个:

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {

private final JAXBContext context;

public JAXBContextResolver() throws Exception {
this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), "package.of.your.model");
}

public JAXBContext getContext(Class<?> objectType) {
return context;
}

}

你只需要在你的资源中这样的东西(假设 DetailProduit 是你想要序列化的对象并且 DetailProduit.java 是 jaxb 标记的并且在 package.of.your.model 中)

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{code}")
public DetailProduit getDetailProduit(@PathParam("code") String code) {
.... Your Code ........
}

关于java - 如何使用 Jersey 将嵌套列表编码为 JSON?我得到一个空值数组或一个包含数组的单元素字典数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1145476/

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