2012-02-07 7 views
9

GSONを使用してJSONの一部をデシリアライズしています。 JSONは次のとおりです。GSON throw例外の解析空の日付フィールド

{ 
    "employee_id": 297, 
    "surname": "Maynard", 
    "givenname": "Ron", 
    "lastlogin": "", 

...

Employeeオブジェクトは、日付フィールドlastloginがあります

public class Employee { 
private Integer employee_id; 

private String surname; 

private String givenname; 

private Date lastlogin; 

私が持っている問題があるlastlogin値が取り込まれていないときに、これはJSONの空のStringなので、GSONパーサは次のようにスローします。

java.text.ParseException: Unparseable date: "" 
at java.text.DateFormat.parse(DateFormat.java:337) 
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79) 
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66) 

これはいつものように?

答えて

30

入力を制御できない(つまりJSon生成部分)、空ではないときの形式を知っていれば、空の値を処理できるデシリアライザを作成するだけです。

GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
     @Override 
     public Date deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) 
       throws JsonParseException { 
      try { 
       return df.parse(json.getAsString()); 
      } catch (ParseException e) { 
       return null; 
      } 
     } 
    }); 
    Gson gson = gsonBuilder.create(); 

https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserializ

を参照してください。
2

これは空の文字列で、Dateは処理方法を知らないためです。 GSON Codeを見ると、引用符をうまく扱えないDateFormat.parseを使って文字列を盲目的に解析していることがわかります。

nullを試しましたか?空の場合はnullを使用してみてください。 DateTypeAdapterのGSONコードのコードから、JSONNullオブジェクトをうまく処理します。それをスキップするだけです。