java - 使用 Jersey 和 MOXy 将 JSON 反序列化为列表集合

标签 java json jersey moxy

我正在尝试获取 JSON 对象并将它们放入一个集合中(我选择了列表)。通过使用适当的 getter 和 setter 创建 BuiltCharacter,我已经能够将 JSON 响应解码为单个 POJO。对于 JSON 元素数组,我尝试了以下方法:

List<BuiltCharacter> characters = response.readEntity(new GenericType<List<BuiltCharacter>>(){});

List<BuiltCharacter> characters = client.target(uri).request(MediaType.APPLICATION_JSON).get(new GenericType<List<BuiltCharacter>>(){});

使用这些方法让我得到以下结果:

线程“main”中的异常 java.lang.ClassCastException:BuiltCharacter 无法转换为 java.util.List

我最初使用 Character 作为类名,但被提醒这是一个保留类名。仍然,我无法弄清楚这里发生了什么!

最佳答案

关于赏金的回答,但它似乎与原始帖子中的问题相同

查看the link您提供的所有示例都返回 SalesType , 而不是 List<SalesType> .你不能指望 SalesType转换为 List<SalesType> .如果您要返回 SalesType从您的资源类中,提供异常。

甚至来自 the link对于原始帖子,JSON 作为 JSON 对象传入。 List不映射到 JSON 对象 ( {} ),而是映射到 JSON 数组 ( [] )。

如果你想要 SalesType 的列表,然后简单地从资源中返回一个列表。下面是一个完整的例子

import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

class SalesType {
    public String test;
}
public class MOXyTest extends JerseyTest {

    @Path("test")
    public static class TestResource {

        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public Response getSalesTypeList() {
            List<SalesType> list = new ArrayList<>();
            SalesType sales = new SalesType();
            sales.test = "test";
            list.add(sales);
            list.add(sales);
            return Response.ok(
                   new GenericEntity<List<SalesType>>(list){}).build();
        }
    }

    @Override
    public Application configure() {
        return new ResourceConfig(TestResource.class);
    }

    @Test
    public void testGetSalesTypeList() {
        List<SalesType> list = target("test").request()
                .get(new GenericType<List<SalesType>>(){});
        for (SalesType sales: list) {
            System.out.println(sales.test);
        }
    }
}

这是我使用的两个依赖项(利用 Jersey Test Framework )

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-inmemory</artifactId>
    <version>${jersey2.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>${jersey2.version}</version>
</dependency>

通过返回 sales 可以很容易地重现您的问题在上面示例的资源类中。上面的当前代码有效,但只是为了查看错误,如果您替换 GenericEntity (它是在 Response 中返回的泛型类型的包装器),您将看到相同的错误

java.lang.ClassCastException: com.stackoverflow.jersey.test.SalesType
                              cannot be cast to java.util.List

关于java - 使用 Jersey 和 MOXy 将 JSON 反序列化为列表集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25310759/

相关文章:

javascript - 将分层 JSON 文件转换为分层 jQuery div

javascript - 从回调中触发时,函数不会返回任何值

java - JAX-RS/Jersey 响应 406 没有实体,但 RFC 2616 推荐一个

java - 组合 2 个 HashMap 并返回 String

java - 如何在PDF文档中添加隐藏图像?

javascript - For循环不适用于js map 功能

scala - SBT - 无法精确 Play 2 应用程序的项目依赖项

rest - JavaEE Jersey 2.0 项目中的 MOXy 异常

java - NoSuchMethodError Request.setTag

java - 有没有办法将 JSON 模式转换为 XSD?