期望对象数组但在对象中有一个对象

在我目前正在从事的一个项目中,我遇到了一个角度异常: 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<Clazz> getCLSs() {

Clazz clazz = new Clazz();

Clazz.setFoo("foo");

Clazz.setBar("bar");

ArrayList<Clazz> clazzes = new ArrayList<>();

clazzes.add(clazz);

return clazzes;

}

}

当我输入网址时,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

<init-param>

<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>

<param-value>true</param-value>

</init-param>

这使用Jackson进行反序列化/序列化。如果未设置,则使用Jersey的内部JSON提供程序进行反序列化/序列化。我不确定如何配置默认提供程序,但是无论如何,只要与Jackson一起使用,都是比较安全的。


除此之外,我在上面的评论中说要测试是否正在使用Jackson。一种轻松完成此操作的方法是ContextResolvergetContext方法内部创建一个and和sop

。需要映射器时将调用此方法。因此,如果正在使用杰克逊,则应打印出

@Provider

public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

private final ObjectMapper defaultMapper;

public ObjectMapperContextResolver() {

defaultMapper = new ObjectMapper();

}

@Override

public ObjectMapper getContext(Class<?> type) {

System.out.println("--- getContext ---");

return defaultMapper;

}

}

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

以上是 期望对象数组但在对象中有一个对象 的全部内容, 来源链接: utcz.com/qa/418486.html

回到顶部