• java.text.ParseException: Failed to parse date ["未知']


    先把"未知"替换为""

    直接new 出来的Gson 对象是无法解析为""的Date属性的,需要通过GsonBuilder来进行创建

    Gson ignoreDateGson=new GsonBuilder().registerTypeAdapterFactory(new DateNullAdapterFactory<>()).create();

    这个registerTypeAdapterFactory()方法就是添加自己的适配器,来对某些特定的类型进行处理.new 出来的这个DateNullAdapterFactory.class 需要自己写.

    import java.util.Date;
     
    import com.google.gson.Gson;
    import com.google.gson.TypeAdapter;
    import com.google.gson.TypeAdapterFactory;
    import com.google.gson.reflect.TypeToken;
     
    public class DateNullAdapterFactory<T> implements TypeAdapterFactory {
        
        @SuppressWarnings("unchecked")
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            Class<T> rawType = (Class<T>) type.getRawType();
            if (rawType != Date.class) {
                return null;
            }
            return (TypeAdapter<T>) new DateNullAdapter();
        }
    }
    import java.io.IOException;
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.ParsePosition;
    import java.util.Date;
    import java.util.Locale;
     
    import com.google.gson.Gson;
    import com.google.gson.JsonSyntaxException;
    import com.google.gson.TypeAdapter;
    import com.google.gson.TypeAdapterFactory;
    import com.google.gson.internal.bind.DateTypeAdapter;
    import com.google.gson.internal.bind.util.ISO8601Utils;
    import com.google.gson.reflect.TypeToken;
    import com.google.gson.stream.JsonReader;
    import com.google.gson.stream.JsonToken;
    import com.google.gson.stream.JsonWriter;
    import com.zxtc.common.utils.StringUtils;
     
    public class DateNullAdapter extends TypeAdapter<Date>{
        
          public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() {
                @SuppressWarnings("unchecked") // we use a runtime check to make sure the 'T's equal
                @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
                  return typeToken.getRawType() == Date.class ? (TypeAdapter<T>) new DateTypeAdapter() : null;
                }
              };
     
              private final DateFormat enUsFormat
                  = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.US);
              private final DateFormat localFormat
                  = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);
     
              @Override public Date read(JsonReader in) throws IOException {
                  
                if (in.peek() == JsonToken.NULL) {
                  in.nextNull();
                  return null;
                }
                String jsonStr = in.nextString();
                if(StringUtils.isBlank(jsonStr)) {
                    return null;
                }else {
                    return deserializeToDate(jsonStr);
                }
              }
     
              private synchronized Date deserializeToDate(String json) {
                try {
                  return localFormat.parse(json);
                } catch (ParseException ignored) {
                }
                try {
                  return enUsFormat.parse(json);
                } catch (ParseException ignored) {
                }
                try {
                    return ISO8601Utils.parse(json, new ParsePosition(0));
                } catch (ParseException e) {
                  throw new JsonSyntaxException(json, e);
                }
              }
     
              @Override public synchronized void write(JsonWriter out, Date value) throws IOException {
                if (value == null) {
                  out.nullValue();
                  return;
                }
                String dateFormatAsString = enUsFormat.format(value);
                out.value(dateFormatAsString);
              }
              
              
    }

    可能还会出现报错:Invalid time zone indicator

    两种结合:把date改string

     

  • 相关阅读:
    c# Action,Func,Predicate委托
    c# 匿名方法
    IIS网站无法启动,提示 另一个程序正在使用此文件
    c# Http下载
    mciSendString详解(转)
    【NOIP2006PJ】数列(sequence)题解
    2020.04.29【NOIP普及组】模拟赛C组30总结
    【USACO 2019 December Silver】Milk Visits题解
    【USACO 2019 February Bronze】Measuring Traffic 题解
    【USACO 2019 February Bronze】Measuring Traffic 题解
  • 原文地址:https://www.cnblogs.com/fswhq/p/ParseException.html
Copyright © 2020-2023  润新知