2012-02-07 10 views
9

Tôi đang sử dụng GSON để deserialise một số JSON. Các JSON là:GSON ném phân tích cú pháp trường trống Trường ngày

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

...

Các đối tượng người lao động có một lastlogin lĩnh vực ngày:

public class Employee { 
private Integer employee_id; 

private String surname; 

private String givenname; 

private Date lastlogin; 

Tôi có vấn đề là khi giá trị lastlogin không dân cư, đó là một Chuỗi trống trong JSON, do đó trình phân tích cú pháp GSON ném:

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) 

Thứ gì là thứ e cách thông thường xung quanh điều này?

Trả lời

30

Nếu bạn không thể kiểm soát đầu vào (tức là phần tạo JSon) nhưng biết định dạng khi nó không trống, bạn chỉ nên viết trình xử lý riêng có thể xử lý các giá trị rỗng, như ví dụ:

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(); 

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

2

Đó là vì nó là một chuỗi rỗng, mà Date không biết cách xử lý. Nếu bạn nhìn vào GSON Code nó cho thấy rằng nó chỉ phân tích cú pháp một cách mù quáng chuỗi bằng cách sử dụng DateFormat.parse, mà không xử lý dấu ngoặc kép tốt.

Bạn đã thử sử dụng null? Hãy thử sử dụng null nếu nó trống. Từ mã cho Mã GSON cho DateTypeAdapter, nó xử lý các đối tượng JSONNull tốt, nó chỉ bỏ qua chúng.