我有一个这样的Message类:
class Message {
@JsonProperty("content")
Object content;
}
其中content属性可以是User
,Post
或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
我想帮助投... 感谢
答案 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
方法。然后,我可以模拟演员。
再次感谢