将Jersey和MOXy的JSON反序列化为List集合

时间:2014-08-14 14:35:31

标签: java json jersey moxy

我试图将JSON对象放入一个集合中(我选择了List)。通过使用适当的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>>(){});

使用这些方法得到了以下内容:

线程中的异常&#34; main&#34; java.lang.ClassCastException:BuiltCharacter无法强制转换为java.util.List

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

1 个答案:

答案 0 :(得分:2)

关于赏金的答案,但它似乎与原帖有同样的问题

查看您提供的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