当前位置: 首页 > 知识库问答 >
问题:

Jackson禁用@JsonFormat注释

司寇旺
2023-03-14

我正在使用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”太短

请在这里帮助我。

预先感谢

共有3个答案

江亮
2023-03-14

尝试使用自定义反序列化程序:

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);
    }
}
邹昊
2023-03-14

在使用readValue方法之前,请尝试下面的代码

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"));
长孙弘盛
2023-03-14

下面是专门禁用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似乎没有内置这种能力(要么是这样,要么是