我正在尝试获取 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/