如何将JSON字符串自定义反序列化为Java日期?

如何将JSON字符串自定义反序列化为Java日期?,java,json,gson,Java,Json,Gson,我正在使用GSON库对客户端和服务器端的java对象进行序列化和反序列化。我有一个场景,在客户端上有一个以毫秒为单位的日期,但在服务器上,我有一个数据类型为date的相同字段。以下是客户端的示例代码- class Dog { long id; long purchaseDate; //This is in milliseconds String name; boolean status; } 在服务器端- class Dog { long id; Date purcha

我正在使用GSON库对客户端和服务器端的java对象进行序列化和反序列化。我有一个场景,在客户端上有一个以毫秒为单位的日期,但在服务器上,我有一个数据类型为
date
的相同字段。以下是客户端的示例代码-

class Dog {
  long id;
  long purchaseDate; //This is in milliseconds
  String name;
  boolean status;
}
在服务器端-

class Dog {
  long id;
  Date purchaseDate; //Convert milliseconds to date
  String name;
  int status; //If boolean is false then 0 else 1
}

如何使用GSON库进行此操作。如果无法通过GSON实现,那么哪种库适合这种序列化/反序列化?

GSON库使用反射形成对象,因此转换长到日期将不可行

看看这个

我试图查看是否能够解析日期值

解析当前的日期一直是GSON api中的一个问题。如果您使用GSonBuilder,但仍然将其从long转换,那么这个问题将得到解决,这听起来不太可能

其中G2是bean类

import java.util.Date;

public class G2 {
private Date val;
private String name;
public Date getVal() {
    return val;
}

public void setVal(String val) {
    this.val = new Date(new Long(val));
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
}

顺便说一句,我甚至试过这个

gSon=new GsonBuilder().setDateFormat(“sss”).create()

这只会影响日期

{“val”:1445467370920,“name”:“name”,“strVal”:“Wed Oct 21 15:16:33 PDT 2015”}

G2[val=2009年12月9日星期二13:51:55太平洋标准时间1969年,name=name]

以上以毫秒为单位的时间1445467370920是星期三10月21日15:42:51 PDT 2015

您可以使用一个自定义值,将JSON中的long转换为POJO中的
日期
。您可以在服务器端使用它,然后客户端和JSON将使用long,服务器将使用
Date

public class DateTypeAdapter extends TypeAdapter<Date> {
  @Override
  public void write(JsonWriter out, Date value) throws IOException {
    out.value(value.getTime());
  }

  @Override
  public Date read(JsonReader in) throws IOException {
    return new Date(in.nextLong());
  }
}
要仅应用于特定字段,请使用注释应用适配器

class Dog {
  long id;
  @JsonAdapter(DateTypeAdapter.class)
  Date purchaseDate; //Convert milliseconds to date
  String name;
  int status; //If boolean is false then 0 else 1
}
请注意,通过此调用,您可以使用常规gson---


我想知道你的用例为什么要存储时间戳,因为他的答案非常有用。我需要更多的澄清。我想知道GSON将如何知道哪个字段必须使用typeadapter。因为我有另一个字段,在客户端是布尔值,在服务器端是int值。那么,我如何使用字段名及其类型适配器呢?这是一个很好的问题——我最初的回答将自定义转换器应用于所有
Date
类型。我编辑了答案以显示如何应用于特定字段。boolean到int是类似的,除了在处理原语时,您需要使对象等效(boolean或Integer),并在boolean或Integer上定义适配器。如果您同时控制服务器和客户机,如果可以的话,最好保持数据模型的一致性。这意味着,除非您有令人信服的理由,否则您可能应该将两个状态值都设置为布尔值或整数,并跳过自定义的
TypeAdapter
,非常感谢。这是我一直在寻找的完美答案。你是对的,不建议使用毫秒,但有一些问题迫使我使用毫秒。除此之外,还有我提到的其他字段“状态”,这两个字段的两端都不同。所以无论如何,我必须解决这个问题。谢谢伊格琳帮我做这件事。
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Date.class, new DateTypeAdapter())
    .create();
class Dog {
  long id;
  @JsonAdapter(DateTypeAdapter.class)
  Date purchaseDate; //Convert milliseconds to date
  String name;
  int status; //If boolean is false then 0 else 1
}
Gson gson = new Gson();