反序列化具有hashmap的json对象失败

时间:2013-06-27 11:19:22

标签: json jackson

我遇到的问题是无法对可能在其中定义hashmap的类进行deseriablize。

我的课程定义如下:

   public class <T extends Serializable> MyClass1 {
       private Map<String,List<MyClass2<T>>> entity;
       boolean moreData=false;
       public Map<String,List<MyClass2<T>>> getEntity() {
         return entity;
       }

      public void setEntity(Map<String,List<MyClass2<T>>> entity) {
         this.entity = entity;
      }
      public boolean isMoreDataAvailable()
      {
        return moreData;
      } 
   }

序列化类的内容会产生如下输出:

ObjectMapper om = getObjectMapper();
    om.writeValueAsString(myclass1inst);
    {
        "MyClass1" : {
          "entity" : {
             "java.util.HashMap" : {
                 "SITE_ADD" : {
                 "java.util.ArrayList" : [ {
                   "MyClass2" : {
                   "priority" : 3,
                     "groupName" : null,
                     "payload" : {
                       "MyClass3" : {
                        "networkType" : "HIGH_SPEED_LAN",
                        "nativeSite" : true
                     }
                   "groupOrderType" : null,
                   "entityGuid" : null
                   }
                 } ]
              }
            }
          },
          "moreDataAvailable" : false
         }
      } 

问题是反序列化对我来说没有这个例外。

ObjectMapper om = getObjectMapper();
om.readValue(content, MyClass1.class);
  

2013-06-27 02:55:47,822 [[ACTIVE]反序列化推送时出错   请求:无效的类型ID'SITE_ADD'(对于id类型'Id.class'):没有这样的   找到的类(通过参考链:MyClass1 [“entity”])

为什么json认为字符串site_add的类型为Id.class。

在阅读jackson json文档时,我发现HashMap必须注册为以下内容:

http://wiki.fasterxml.com/JacksonInFiveMinutes

  

Map result = mapper.readValue(src,new   TypeReference&gt;(){});

我是否必须实施 @jsondeserialable 来定义自定义反序列化。请提供你的建议。

以下是对象初始化的代码

        public static ObjectMapper getObjectMapper() {
            ObjectMapper om = new ObjectMapper();

            // to remove wrapping of root element
            om.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, false);

            om.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);

            // to handle inheritence
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL,
                           JsonTypeInfo.As.WRAPPER_OBJECT);

            // to ignore getters which doesnt have setters


            om.configure(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false);



           // to ignore extra properties during deserialization
            om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                 false);
            return om;
         }

在上面的例子中,变量T指向MyClass3。

0 个答案:

没有答案