我正在使用jackson库,我遇到了一种情况,我想在序列化/反序列化时使用对象映射器禁用@JsonFormat注释。
我的Api代码在第三方库中,所以我不能删除/添加任何注释,所以objectMapper是唯一的选择。
Api类别:
public class ApiClass {
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
private DateTime time;
}
我的代码:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(Feature.ALLOW_COMMENTS, true);
objectMapper.configure(MapperFeature.AUTO_DETECT_IS_GETTERS, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setSerializationInclusion(Include.NON_ABSENT);
objectMapper.registerModule(new JodaModule());
objectMapper.registerModule(new JavaTimeModule());
String str = " {\"time\": \"2012-05-01\"}";
ApiClass msg = objectMapper.readValue(str, ApiClass.class);
我希望这种转换成功发生。
目前我得到了:com.fasterxml.jackson.databind。JsonMappingException:格式无效:“2012-05-01”太短
请在这里帮助我。
预先感谢
尝试使用自定义反序列化程序:
public class MyTest {
@Test
public void myTest() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
objectMapper.configure(MapperFeature.AUTO_DETECT_IS_GETTERS, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
objectMapper.registerModule(new JavaTimeModule());
String str = " {\"time\": \"2012-05-01\"}";
SimpleModule module = new SimpleModule();
module.addDeserializer(DateTime.class, new DateTimeDeserializer());
objectMapper.registerModule(module);
ApiClass msg = objectMapper.readValue(str, ApiClass.class);
System.out.println(msg.getTime());
}
}
class ApiClass {
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
private DateTime time;
public DateTime getTime() {
return time;
}
public void setTime(DateTime time) {
this.time = time;
}
}
class DateTimeDeserializer extends StdDeserializer<DateTime> {
public DateTimeDeserializer() {
this(null);
}
public DateTimeDeserializer(Class<?> vc) {
super(vc);
}
@Override
public DateTime deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException {
JsonNode node = jp.getCodec().readTree(jp);
String time = node.asText();
return new DateTime(time);
}
}
在使用readValue
方法之前,请尝试下面的代码
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"));
下面是专门禁用JsonFormat的代码:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(Feature.ALLOW_COMMENTS, true);
objectMapper.configure(MapperFeature.AUTO_DETECT_IS_GETTERS, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setSerializationInclusion(Include.NON_ABSENT);
objectMapper.registerModule(new JodaModule());
objectMapper.registerModule(new JavaTimeModule());
objectMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
@Override
protected <A extends Annotation> A _findAnnotation(final Annotated annotated,
final Class<A> annoClass) {
if (!annotated.hasAnnotation(JsonFormat.class)) { //since we need to disable JsonFormat annotation.
return super._findAnnotation(annotated, annoClass);
}
return null;
}
});
String str = " {\"time\": \"2012-05-01\"}";
ApiClass msg = objectMapper.readValue(str, ApiClass.class);
System.out.println(objectMapper.writeValueAsString(msg ));
如果我们需要禁用多个注释(JsonFormat,JsonUnWrapped ),那么:
替换:
if (!annotated.hasAnnotation(JsonFormat.class)) {
与:
if (!annotated.hasOneOf(new Class[] {JsonFormat.class, JsonUnwrapped.class})) {
谢谢大家。
我正在我的gradle项目中使用。自从将添加到我的项目构建文件后,我在运行gradle项目时遇到了这个异常。这里是我的错误的堆栈跟踪。 我在我的类中使用了未使用的。但是我确实有和注释,它们使用两个类来序列化和反序列化我的到UTC格式的Json和从Json到Json的。我是第一次做这个序列化和反序列化,所以请给出任何建议。 这是我的分级文件代码:
我需要使用两个jackson 2对象映射器。两个映射器都使用同一组类。首先,我需要使用标准序列化。在第二个例子中,我想对所有类使用数组形状类型(请参见https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.Shape.html#ARRAY).
我想用特定的格式序列化POJO的某些日历字段。 我将添加一个格式为字符串的字段,因为它实际上是以24小时为单位表示一天,而不是一个特定的时间瞬间。但当我添加带有注释的新字段时: 我希望得到这样的JSON: 相反,我遇到了以下例外情况:
后端实体类使用了@jsonformat注释,但在前端获取数据时24-hour和12hour中的时间格式似乎存在问题。例如,后端时间为2021-5-21 00:50,但发送到前端的时间变成了2021-5-21 12:50。是@jsonformat的属性设置有问题还是前端。
我有一个具有以下属性的枚举: 此枚举有一个带有Jackson的@JsonValue注释的函数: 这将根据需要执行,将枚举值序列化为toString返回的值,这是枚举的名称。 我希望能够禁用@JsonValue注释,并且仅使用附加到此类的 Jackson 的默认 JSON 序列化行为:在某些情况下,必须获取表示整个枚举的对象而不仅仅是名称,)。 Jackson似乎没有内置这种能力(要么是这样,要么是