2

我有一个像这样的消息类:

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

其中内容属性可以是 a User、 aPost或 a String ,我必须将此对象发送到服务器并将内容转换为正确的类。

我正在使用 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

我想帮助铸造...谢谢

4

3 回答 3

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 启用类型信息,如果使用别名,则必须在客户端定义相同的。

于 2012-11-13T16:14:41.637 回答
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示例)

这将在序列化时添加以类名作为值的属性“类型”(也有许多替代方法),并在反序列化时使用它。

于 2012-11-14T01:13:05.253 回答
0

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

再次感谢

于 2012-12-10T13:25:46.727 回答