【问题标题】:How to serialize this JSON Array String using Jackson Annotations?如何使用 Jackson Annotations 序列化这个 JSON 数组字符串?
【发布时间】:2011-02-25 21:22:02
【问题描述】:

[{"ID":"hzQ8ll","CreationDate":"2011 年 2 月 24 日星期四 12:53:31 GMT","Count":6,"Name":"SOMETAG"}]

里面是Tag类型所以我只写了这个Java类:

public class Tags {
    public List <Tag>tags;
}

但我得到com.sun.jersey.api.client.ClientHandlerException:

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.test.Tags  out of START_ARRAY token

我正在使用带有 JacksonJsonProvider 的 Jersey,如下所示:

ClientConfig config = new DefaultClientConfig();
config.getClasses().add(JacksonJsonProvider.class);

然后我只做一个简单的 Jersey 客户端调用:

ClientResponse response = builder.get(ClientResponse.class);
Tags tags = response.getEntity(Tags.class);

有什么想法吗?大多数时候,我最外层的元素都有一个与之关联的名称,所以这对我来说是新的。感谢您的帮助

【问题讨论】:

  • 你能告诉我们你在哪里使用它的实际代码吗?
  • 见上文。我使用球衣,所以没有真正的杰克逊代码,因为我让提供商为我处理它。谢谢

标签: json parsing jersey jackson


【解决方案1】:

您可能必须声明 Tag[] 而不是 List&lt;Tag&gt;。 我在使用不同的 JSON 库时遇到了类似的问题。 这似乎与内省通用容器的困难有关。

你有一个奇怪的 get() 用法。

http://jersey.java.net/nonav/apidocs/1.5/jersey/com/sun/jersey/api/client/UniformInterface.html#get%28java.lang.Class%29

返回值和参数类型应该相同。

要么:

 ClientResponse resp = builder.get(ClientResponse.class);

 Tag[] resp = builder.get(Tag[].class);

无论如何,问题似乎在于您的 JSON 数据是一个数组,并且它被反序列化为不是(标签)的东西。

直接试试这个:

Tag[] tags = response.getEntity(Tag[].class); 

【讨论】:

  • 感谢您的快速回复。我将 List 标签更改为 Tag []tags,我得到了同样的错误。
  • 对代码很抱歉。我纠正了。我知道我得到了一个 JSON 数组,所以我想我的问题是如何定义一个 java 对象,以便 Jackson 正确解析 JSON 数组?谢谢
  • 应该类似于 Tag[] tags = response.getEntity(Tag[].class);或 List tags = response.getEntity(List.class);
  • Tag[] resp = builder.get(Tag[].class) 是正确的方法。谢谢。 List.class 的语法无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多