【问题标题】:How can I send the Object class to server with Jackson?如何使用 Jackson 将 Object 类发送到服务器?
【发布时间】:2012-11-13 13:48:19
【问题描述】:

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

class Message {
   @JsonProperty("content")
   Object 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

我想在铸造方面得到帮助... 谢谢

【问题讨论】:

  • 请发布代码的所有相关部分。你使用什么 Jackson 注释?你得到什么错误?
  • 杰克逊不做基于内容的反序列化。您将不得不自己处理传入 JSON 到类型的映射。
  • 我该如何做这张地图?你能告诉我正确的方法吗?
  • @Perception Jackson 可以进行多态处理,但是,通过添加额外的类型信息
  • @StaxMan - OP 使用的类仅与它们从 java.lang.Object 的扩展一样多态。您链接的教程中的示例 6 是 OP 必须执行的自定义到期序列化示例。

标签: java android json casting jackson


【解决方案1】:

当您控制两端(服务器和客户端)时,您可以尝试使用 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 启用类型信息,如果你使用别名,你必须在客户端定义相同的。

【讨论】:

    【解决方案2】:

    你需要的是@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”,类名作为值(也有许多替代方法),并在反序列化时使用它。

    【讨论】:

      【解决方案3】:

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

      再次感谢

      【讨论】:

        猜你喜欢
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        相关资源
        最近更新 更多