如何使用Jackson将Object类发送到服务器?

时间:2012-11-13 13:48:20

标签: java android json casting jackson

我有一个这样的Message类:

class Message {
   @JsonProperty("content")
   Object content;
}

其中content属性可以是UserPostString 我必须将此对象发送到服务器并将内容转发到正确的类。

我正在使用Jackson注释来序列化JSON,但是当我尝试转换内容时,会出现错误,因为属性内容像LinkedHashMap对象一样到达服务器。

错误是:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/MegaRadarSocial].[Resteasy]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to br.com.megaradar.megaradarsocial.model.User

我想帮助投... 感谢

3 个答案:

答案 0 :(得分:0)

当您控制两端(服务器和客户端)时,您可以尝试Genson库http://code.google.com/p/genson/。它的一个功能允许您序列化为json并输入信息,这使您可以反序列化为正确的类型。

Genson genson = new Genson.Builder().setWithClassMetadata(true).create();
json = genson.serialize(yourMessage);

// then deserialize it back
Message message = genson.deserialize(json, Message .class);

序列化的json将如下所示:{“content”:{“@ class”:“package.path.Message”,...对象值...}}

您甚至可以为序列化类定义别名

new Genson.Builder().addAlias("message", Message.class)

重要:请注意,您需要在两侧使用相同的genson配置。因此,使用setWithClassMetadata启用类型信息,如果使用别名,则必须在客户端定义相同的内容。

答案 1 :(得分:0)

您需要的是@JsonTypeInfo注释,如下所示:

class Message {
 @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY property="type")
 @JsonProperty("content")
 Object content;
}

(您可以查看http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html示例)

在序列化时会添加类名称作为值的属性“type”(还有许多替代方法),并在反序列化时使用它。

答案 2 :(得分:0)

感谢您的所有答案。但我找到了另一种方法将我的Object转换为我想要的任何类型。 我正在使用convertValue对象中的ObjectMapper方法。然后,我可以模拟演员。

再次感谢