使用GSON时间戳反序列化json

时间:2018-10-01 03:26:07

标签: java gson

我有一个json字符串,例如

  

{“开始时间”:“ 10:00 AM”,“结束时间”:“ 11:00 PM”}

如果我通过GSON使用POJO反序列化,那么可以看到它们将映射到我的类中的String变量。最终,我想使用用户提供的时间,看看它是否在范围内。 我能想到的唯一方法是,每次有时间时,我都会将这些字符串可变项转换为对象(无论是Joda时间,Date,LocalTime等),然后进行比较。

有更好的方法吗?我可以让GSON直接将字符串反序列化为时间对象吗?还是以某种方式节省了在比较期间始终进行这些转换的步骤?还是我提出真正正确设计的方式?

谢谢

4 个答案:

答案 0 :(得分:1)

您可以使用GsonBuilder将时间解析为日期,并指定日期格式:

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setDateFormat("HH:mm a");
    Gson gson = gsonBuilder.create();
    Pojo fromJson = gson.fromJson(<string>, Pojo.class);

POJO字段将如下所示(如果需要,请重命名):

    private Date start_time;
    private Date end_time;

答案 1 :(得分:0)

您是否编写了具有这两个属性的类,这些属性指定了类似小时的(可能是Calendar)类型?例如:

public MyTimeRange {
  private Calendar startTime;
  private Calendar endTime;
  ...
}

然后在反序列化时:

MyTimeRange myRange = gson.fromJson(jsonStr, MyTimeRange.class);

答案 2 :(得分:0)

我不能使用 Gson 来做到这一点,但是可以使用 jackson 库。为此,您将不得不在POJO的setter方法中进行一些修改。 在pom中添加以下jackson依赖项,然后按照以下示例在POJO中进行修改。在我的setter方法的POJO中,我将字符串作为输入参数,并将其转换为日期后进行分配。

依赖性:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.7</version>
</dependency>

POJO类:在这里,我没有在setter中添加null检查,如果在json中没有与开始和结束日期相对应的值,则可能导致NPE。因此,您可以在setter中添加一个空值检查,然后再将其转换为Date。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

class TimePojo {
    private Date start_time;
    private Date end_time;
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");

    public Date getStart_time() {
        return start_time;
    }

    public void setStart_time(String start_time) throws ParseException {

        this.start_time = sdf.parse(start_time);
    }

    public Date getEnd_time() {
        return end_time;
    }

    public void setEnd_time(String end_time) throws ParseException {
        this.end_time = sdf.parse(end_time);
    }

}

以及使用杰克逊将json转换为POJO的代码

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestGson {
    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        String json = "{\"start_time\": \"10:00 AM\", \"end_time\" : \"11:00 PM\"}";
        ObjectMapper mapper = new ObjectMapper();
        TimePojo obj = mapper.readValue(json, TimePojo.class);
        System.out.println(obj.getStart_time());
        System.out.println(obj.getEnd_time());
    }
}

答案 3 :(得分:0)

您对图书馆的要求不高。您可以用纯Java自己编写类,因为您一天只比较24小时。您可以这样:

public class TimeKeeper implements Comparable<TimeKeeper> {
    byte startHour;
    byte startMinute;
    byte endHour;
    byte endMinute;
    public TimeKeeper(String start, String end) {
        startHour = parseHour(start);
        startMinute = parseMinute(start);
        endHour = parseHour(end);
        endMinute = parseMinute(end);
    }
    public byte parseHour(String time) {
        byte hour = Byte.valueOf(String.split(time, ":")[0]);
        if(time.contains("PM") {
            hour += 12;
        }
        return hour;
    }
    public byte parseMinute(String time) {
         return Byte.valueOf(String.valueOf(time, ":")[1].substring(0, 2));
    }
    @Override
    public int compareTo(TimeKeeper tk) {
        int diff = startHour - tk.startHour;
        if(diff == 0) {
            return startMinute - tk.startMinute;
        }
        return diff;
    }
}