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

Jackson注释不适用于自定义日期序列化程序

柳浩大
2023-03-14

我阅读了Jackson的annotations文档,但是我仍然找不到如何从annotations调用自定义序列化程序来序列化< code>java.sql.Date对象。

class Test {
    java.sql.Date mDate = null;

    @JsonValue("serializeDate")       //@JsonValue(DateAsTimestampSerializer.class)
    public Date getCreationDate() {
        return mDate;
    }

    public void String serializeDate(Date d) {
        return String.valueOf(d.getTime());
    }

    class DateAsTimestampSerializer extends JsonSerializer<Date>
    {
         @Override
         public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) 
              throws IOException, JsonProcessingException {
             jgen.writeFieldName(String.valueOf(value.getTime()));
         }
    }
}

但是注释@JsonValue似乎只接受布尔值作为参数,而注释doc则表示:

@JsonValue(method):用于标记返回值用作对象序列化的方法;通常用于标记生成字符串的方法(如toString())以生成JSON原语值序列化块引号

我是否使用了正确的注释?如何从序列化程序而不是toString()返回值?

共有1个答案

尉迟鑫鹏
2023-03-14

您应该使用 JsonSerialize annotation。而您的日期序列化程序的实现包含错误。我认为,想要序列化日期值而不是名称 - 使用 writeString 方法而不是 writeFieldName 方法。

请参阅我的示例:

import java.io.IOException;
import java.io.StringWriter;
import java.sql.Date;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        A a = new A();
        a.setDate(new Date(System.currentTimeMillis()));

        ObjectMapper objectMapper = new ObjectMapper();
        StringWriter writer = new StringWriter();
        objectMapper.writeValue(writer, a);
        System.out.println(writer);
    }
}

class A {

    @JsonSerialize(using = DateAsTimestampSerializer.class)
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

class DateAsTimestampSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeString(String.valueOf(value.getTime()));
    }
}
 类似资料:
  • 根据这个答案:https://stackoverflow.com/a/43342675/5810648 我编写了这样的序列化程序: 如果注释存在并且字段为,则Witch应该编写字符串“N/A”。但是方法仅对非空字段调用。 此外,我还尝试调用setNullValueSerializer: 有了这样的实施: 但没有结果。 如何以这种方式处理空字段? 使现代化 根据讨论:https://github.c

  • 我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?

  • 问题内容: 我正在尝试创建将影响序列化值的自定义杰克逊注释。 含义: 现在序列化对象X(10)将导致: 我该如何实现? 问题答案: 结果:

  • 问题内容: 根据这个答案:http://codingdict.com/questions/137507 我写了这样的序列化器: 如果注释存在且字段为,则女巫应该写字符串“ N / A” 。但是仅对非空字段调用方法。 另外,我尝试致电: 通过这样的实现: 但是没有结果。 如何以这种方式处理空字段? 更新资料 根据讨论:https : //github.com/FasterXML/jackson- d

  • 下面的代码再现了这个问题: 上面的代码不做其他注册“自定义”序列化程序的事情(只是委托回原始序列化程序),但它生成的JSON没有null属性: {“第一个”:“鲍勃”,“最后一个”:“巴克”} 我读过许多看似相关的SO文章,但没有一篇能让我找到解决方案。我尝试在序列化时显式地将映射器设置为,但没有成功。 我唯一的线索是JavaDoc for JsonSerializer中的一条注释: 注意:永远不

  • 我正在尝试用自定义日期格式序列化和反序列化相当简单的对象: 在执行main方法时,我希望得到类似于: “日期”:“20151117” 20151117 但不幸的是得到了以下几点: {“日期”:“20151117”} 20151117-01-01T00:00:00.000+03:00(年份不正确) 似乎Jackson忽略了对象反序列化的@JSONFORMAT注释,并将字符串视为ISO-8601符号中