期望一个对象数组但在对象中得到一个对象

在我正在进行的项目中,我遇到了一个角度exception: Error: [$resource:badcfg] Error in resource configuration. Expected response to contain an array but got an object? Error: [$resource:badcfg] Error in resource configuration. Expected response to contain an array but got an object?

在我寻找解决方案的搜索中,我直接将Web服务的URL输入到我的浏览器中,令人惊讶的是我没有按预期收到数组。

Web服务类:

 @Path("/menu") public class MenuHandler { @GET @Path("/cls") @Produces(MediaType.APPLICATION_JSON) public List getCLSs() { Clazz clazz = new Clazz(); Clazz.setFoo("foo"); Clazz.setBar("bar"); ArrayList clazzes = new ArrayList(); clazzes.add(clazz); return clazzes; } } 

当我输入url http://localhost:8080/myProject/rest/menu/cls我希望看到一个带有JSON对象的JSON数组:

 [ {"foo": "foo", "bar": "bar"} ] 

但相反,我收到一个JSON对象,其中包含我期望没有任何数组的JSON对象的属性:

 { "clazz": { "foo": "foo", "bar": "bar" } } 

所以我想知道为什么没有数组,当我添加另一个Clazz对象时会发生什么。 在这种情况下,我仍然得到一个JSON对象,但这次参数之一是我希望从一开始就拥有的JSON数组。

 { "clazz": [ { "foo": "foo", "bar": "bar" }, { "foo": "foo2", "bar": "bar2" } ] } 

有人可以解释一下为什么会出现这种情况以及我的想法出错了吗?

所以我发现了这个问题。 我能够重现它。 看来你刚忘了启用POJOMappingFeature

  com.sun.jersey.api.json.POJOMappingFeature true  

这使用Jackson来反序列化/序列化。 如果未设置,则使用Jersey的内部JSON提供程序进行反序列化/序列化。 我不确定如何配置默认提供商,但我认为最好还是选择jackson。


另外,在我上面的评论中,我说要测试jackson是否被使用。 轻松实现此目的的一种方法是在getContext方法中创建ContextResolver和sop。 需要映射器时调用此方法。 因此,如果使用jackson,那应该打印出来

 @Provider public class ObjectMapperContextResolver implements ContextResolver { private final ObjectMapper defaultMapper; public ObjectMapperContextResolver() { defaultMapper = new ObjectMapper(); } @Override public ObjectMapper getContext(Class type) { System.out.println("--- getContext ---"); return defaultMapper; } } 

请注意,这也是使用Jackson serization / deserialization进行任何配置的一种方法(只需配置映射器)。

可能是您想使用GenericEntity并返回Response。

 @GET @Path("/cls") @Produces({ MediaType.APPLICATION_JSON }) public Response getCLSs() { List objects = new ArrayList(); // logic goes here // now wrap List into GenericEntity GenericEntity> entity = new GenericEntity>( objects) { }; return Response.ok(entity).build(); }