Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json Jackson-序列化时忽略映射超类_Json_Serialization_Map_Jackson_Resteasy - Fatal编程技术网

Json Jackson-序列化时忽略映射超类

Json Jackson-序列化时忽略映射超类,json,serialization,map,jackson,resteasy,Json,Serialization,Map,Jackson,Resteasy,我有几个扩展了LinkedHashMap的模型类:它们定义了封装映射的get和put方法的getter和setter。我试图使用Jackson(使用RESTEasy)序列化这些类的实例,但Jackson拒绝关注我的getter,它们是用@JsonProperty注释的。相反,它只是序列化支持映射的键值对。我尝试使用@jsonautodect禁用所有方法和字段的自动检测,但这并没有改变任何事情。有没有办法防止Jackson自动序列化映射,或者我必须创建不扩展LinkedHashMap的新模型类 我

我有几个扩展了
LinkedHashMap
的模型类:它们定义了封装映射的get和put方法的getter和setter。我试图使用Jackson(使用RESTEasy)序列化这些类的实例,但Jackson拒绝关注我的getter,它们是用
@JsonProperty
注释的。相反,它只是序列化支持映射的键值对。我尝试使用
@jsonautodect
禁用所有方法和字段的自动检测,但这并没有改变任何事情。有没有办法防止Jackson自动序列化映射,或者我必须创建不扩展
LinkedHashMap
的新模型类

我有几个扩展了
LinkedHashMap
的模型类:它们定义了封装映射的get和put方法的getter和setter

这是一个典型的不使用继承的例子:您发现另一段代码(如Jackson)将您的类视为其超类的实例,而您不希望它这样做。在这样的情况下(以及一般情况下),通常最好使用组合而不是继承


我建议重写模型类以包含映射,而不是扩展映射。您得到的控制比方法多得多,并且生成的模型不那么脆弱。如果您需要将您的模型视为
映射
,则实现一个
asMap
方法(或类似方法),以呈现该视图。

我同意@skaffman的回答。但是,如果您不能轻易地彻底改变继承结构,可能有办法解决这个问题

一种可能性是,如果您确实有一个定义getter/setter的接口,那么可以添加

@JsonSerialize(as=MyInterface.class)
@JsonDeserialize(as=MyInterface.class)
这将迫使Jackson只使用通过特定接口可用的任何东西


自定义序列化器/反序列化器也是一种可能,但这需要大量的工作。

您可以实现自己的
org.codehaus.jackson.map.DeserializerProvider
,它扩展了jackson的
org.codehaus.jackson.map.deser.StdDeserializerProvider
和覆盖方法
\u createDeserializer

import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.deser.StdDeserializerProvider;
import org.codehaus.jackson.map.DeserializationConfig;
...

class MyDeserializerProvider extends StdDeserializerProvider {

    @Override
    protected JsonDeserializer<Object> _createDeserializer(DeserializationConfig config, JavaType type, BeanProperty property) throws JsonMappingException {
        if (type.isMapLikeType()) {       // (1)
            return this._factory.createBeanDeserializer(config, this, type, property);
        } else {
            return super._createDeserializer(config, type, property);
        }
    }
}

我用Jackson 1.9.11测试了这一点。

谢谢你的回复,斯卡夫曼。实际上,我正在考虑转向一种基于作文的方法
LinkedHashMap
实际上不是我的模型类的直接超类;相反,它们扩展了MongoDB的
BasicDBObject
,这使我能够轻松地持久化它们。但是,我可能试图将这些对象用于太多的目的。添加toDBObject()和fromDBObject()方法应该可以工作。然而,我仍然很好奇是否有办法阻止Jackson进行默认的
Map
序列化。有没有办法禁用特定类型的序列化程序?
ObjectMapper om = new ObjectMapper();
om.setDeserializerProvider(new MyDeserializerProvider());