我使用jackson 2. x进行序列化和反序列化。我注册了对象映射器到后燃烧器模块,并配置对象映射器忽略未知属性
objectMapper.registerModule(new AfterBurnerModule());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
但是当它试图序列化一个对象时,它失败了,因为属性错误找到了未知的字段
java对象还带有@JsonIgnoreProperties注释(ignoreUnknown=true)
有人能帮我理解可能出了什么问题吗
下面是Util类
package example;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
public final class Util {
private static ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
objectMapper.registerModule(new AfterburnerModule());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
objectMapper.setDateFormat(sdf);
objectMapper.setAnnotationIntrospector(AnnotationIntrospector.pair(new JaxbAnnotationIntrospector(objectMapper.getTypeFactory()), new JacksonAnnotationIntrospector()));
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setSerializationInclusion(Include.NON_NULL);
}
private Util() {
}
public static <T> T convertToObject(String jsonString,Class<T> classType){
T obj = null;
try {
obj = objectMapper.readValue(jsonString, classType);
} catch (Exception e) {
}
return obj;
}
public static String convertToString(Object obj)
throws IOException {
return objectMapper.writeValueAsString(obj);
}
}
枚举类编号
package sample;
public enum NumberEnum {
ONE, TWO
}
甲级
package sample;
@JsonIgnoreProperties(ignoreUnknown = true)
public class A {
@JsonProperty
private NumberEnum number;
}
我反序列化的代码如下所示
A a = Util.convertToObject(str, A.class);
我试图反序列化的字符串如下所示:
{
"number": "Num"
}
以下是反序列化时的错误:
通用域名格式。fasterxml。杰克逊。数据绑定。exc.InvalidFormatException:无法构造示例的实例。NumberEnum来自字符串值“Num”:值不是声明的枚举实例名称之一:[1,2]at(通过引用链:sample.A[“A”]-
类A是从jar导入的,它使用的是jackson library 1.9
我认为你需要反序列化的实际上是json,看起来像这样:{"number":"ONE"}
-或者-
{"number":"TWO"}
因为"Num"不是枚举的名称(),所以它不会反序列化
ignoreUnknown
仅适用于目标对象中未知的属性名称。例如,如果您有:
{
"number": "ONE",
"foo": "bar"
}
如果您试图反序列化的对象没有名为"foo"的setter/属性,Jackson通常会失败。
您试图完成的是完全不同的;属性是已知的,但您试图处理无效的枚举值。如果您只是希望它将未知值反序列化为null,请使用READ_UNKNOWN_ENUM_VALUES_AS_NULL
:
允许将未知Enum值解析为空值的功能。如果禁用,未知的Enum值将引发异常。(...)默认情况下禁用功能。
这是通过mapper配置完成的:
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
注意:我刚刚看到您使用的是Jackson 1.9,这个反序列化功能是在2.0中发布的。如果升级不是一个选项,您可能需要为此属性创建一个自定义反序列化程序,该程序也会执行相同的操作。
问题内容: 我正在使用Jackson JSON库将一些JSON对象转换为android应用程序上的POJO类。问题是,JSON对象可能会更改,并且在发布应用程序时会添加新字段,但是即使添加简单的String字段(即使可以安全地忽略),当前它也会中断。 有什么办法告诉杰克逊忽略新添加的字段?(例如,在POJO对象上不存在)?全局忽略将是巨大的。 问题答案: Jackson提供了可以在类级别使用的注释
知道我做错了什么吗?如果重要的话,我将使用Jackson-core 2.1.1。
我有一个问题。 然后在第二类中,即使我没有使用第二个字段,它仍然被添加为NULL。 我怎样才能避免这种情况呢?
我正在用java中的jackson构建一个json体。它会像下面这样 基于不同的 REST URI,json 主体必须忽略某些字段或元素。如何使用杰克逊忽略上述 json 正文中的“学生”部分?当我忽略它时,我应该只能得到 但我得到它如下,这是不正确的- 我有两个带有getters和setters的类,一个作为主语,另一个作为学生。我尝试使用@JsonIgnore,但是它忽略了所有的URI,这是我
问题内容: 我收到以下错误,但找不到解决方法对我有用: 无法识别的字段“ GaugeDeviceId”(GaugeDevice类),未标记为可忽略 问题似乎是,该服务返回的属性名称前带有一个大写字母,而类属性则以一个下一个字母开头。 我试过了: 将propertyNames更改为第一个大写字母-相同的错误 添加到属性实例化-同样的错误 添加到相应的吸气剂-同样的错误 添加到相应的二传手-同样的错误