我有一个json字符串,例如
{“开始时间”:“ 10:00 AM”,“结束时间”:“ 11:00 PM”}
如果我通过GSON使用POJO反序列化,那么可以看到它们将映射到我的类中的String变量。最终,我想使用用户提供的时间,看看它是否在范围内。 我能想到的唯一方法是,每次有时间时,我都会将这些字符串可变项转换为对象(无论是Joda时间,Date,LocalTime等),然后进行比较。
有更好的方法吗?我可以让GSON直接将字符串反序列化为时间对象吗?还是以某种方式节省了在比较期间始终进行这些转换的步骤?还是我提出真正正确设计的方式?
谢谢
答案 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;
}
}