如何在Jackson和Gson之间转换日期?

5
在我们基于Spring配置的REST服务器中,我们使用Jackson将对象转换为Json。该对象包含多个java.util.Date对象。
当我们尝试在Android设备上使用Gson的fromJson方法反序列化它时,我们会收到“java.text.ParseException:无法解析的日期”错误。我们已经尝试将日期序列化为自1970年以来的毫秒数对应的时间戳,但是仍然得到相同的异常。
是否可以配置Gson以解析时间戳格式的日期(例如1291158000000)并转换为java.util.Date对象?
2个回答

7

您需要为日期注册自己的反序列化器。

我创建了一个小例子,其中JSON字符串“23-11-2010 10:00:00”被反序列化为Date对象:

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;


public class Dummy {
    private Date date;

    /**
     * @param date the date to set
     */
    public void setDate(Date date) {
        this.date = date;
    }

    /**
     * @return the date
     */
    public Date getDate() {
        return date;
    }

    public static void main(String[] args) {
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {

            @Override
            public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
                    throws JsonParseException {

                SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
                String date = json.getAsJsonPrimitive().getAsString();
                try {
                    return format.parse(date);
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Gson gson = builder.create();
        String s = "{\"date\":\"23-11-2010 10:00:00\"}";
        Dummy d = gson.fromJson(s, Dummy.class);
        System.out.println(d.getDate());
    }
}

1
这并没有真正回答问题,是吗?问题明确说明了“时间戳格式的日期”。 - Nilzor

1
关于Jackson,你不仅可以在数字(时间戳)和文本序列化(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS)之间进行选择,还可以定义用于文本变体的确切DateFormat(SerializationConfig.setDateFormat)。因此,如果Gson不支持ISO-8601格式,你应该能够强制使用一些Gson认可的内容,而Jackson默认使用它。
另外:如果你不介意在Android上使用Jackson,那么它也可以正常工作,而不是Gson。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接