gson Java使用本地日期时间解析JSON 0000-00-00 00:00:00

qjp7pelc  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(280)

我遇到了一个问题。我正在调用我的Web服务器,它返回给我一个JSON字符串。在这个JSON字符串中,我有几个如下所示的对象:

  1. public class Transaction {
  2. private int id;
  3. private LocalDateTime datetime;
  4. private double quantity;
  5. private double avgPrice;
  6. public ArrayList<Transaction> parseJsonToList(String StrJSON) {
  7. Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) -> {
  8. try{
  9. return LocalDateTime.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  10. } catch (DateTimeParseException e){
  11. return LocalDateTime.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"));
  12. }
  13. }).create();
  14. Type listType = new TypeToken<ArrayList<Transaction>>() {}.getType();
  15. return gson.fromJson(StrJSON, listType);
  16. }
  17. }

现在,当我调用parseJsonToList()方法时,我创建了一个GsonBuilder,它应该将日期时间从JSON转换为LocalDateTime属性(有或没有微时间)。我现在遇到的问题是,一些日期时间值是0000-00-00 00:00:00。这给我带来了以下错误:

  1. Exception in thread "main" java.time.format.DateTimeParseException: Text '0000-00-00 00:00:00' could not be parsed at index 19
  2. at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2051)
  3. at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1953)
  4. at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:493)
  5. at com.company.Transaction.lambda$parseJsonToList$1(Transaction.java:109)
  6. at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
  7. at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103)
  8. at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
  9. at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
  10. at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
  11. at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
  12. at com.google.gson.Gson.fromJson(Gson.java:810)
  13. at com.google.gson.Gson.fromJson(Gson.java:775)
  14. at com.google.gson.Gson.fromJson(Gson.java:724)

现在我不能更改JSON,那么有没有办法仍然存储它或使用空值?

cu6pst1q

cu6pst1q1#

您可以使用DateTimeFormatter#withResolverStyle(ResolverStyle.LENIENT)

  1. import java.time.LocalDateTime;
  2. import java.time.format.DateTimeFormatter;
  3. import java.time.format.ResolverStyle;
  4. import java.util.Locale;
  5. public class Main {
  6. public static void main(String[] args) {
  7. DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.ENGLISH)
  8. .withResolverStyle(ResolverStyle.LENIENT);
  9. String str = "0000-00-00 00:00:00";
  10. LocalDateTime ldt = LocalDateTime.parse(str, dtf);
  11. System.out.println(ldt);
  12. }
  13. }

输出:

  1. -0001-11-30T00:00
展开查看全部

相关问题