2014-04-03 15 views
9

Tôi đang sử dụng RestTemplete để lấy dữ liệu json từ một api nghỉ ngơi và tôi đang sử dụng Gson để phân tích dữ liệu từ định dạng json vào Objectcom.google.gson.JsonSyntaxException khi cố gắng phân tích Date/Time trong json

Gson gson = new Gson(); 

restTemplate = new RestTemplate(); 
restTemplate.getMessageConverters().add(new GsonHttpMessageConverter()); 
restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 

List<Appel> resultList = null; 

resultList = Arrays.asList(restTemplate.getForObject(urlService, Appel[].class)); 

nhưng tôi nhận được vấn đề này với ngày, tôi nên làm gì ..

Could not read JSON: 1382828400000; nested exception is com.google.gson.JsonSyntaxException: 1382828400000 

POJO của tôi có chứa các POJO khác trong cơ thể của nó

public class Appel implements Serializable { 

    private Integer numOrdre; 
    private String reference; 
    private String objet; 
    private String organisme; 
    private Double budget; 
    private Double caution; 
    private Date dateParution; 
    private Date heureParution; 
    private Date dateLimite; 
    private Date heureLimite; 
    private List<Support> supportList; 
    private Ville villeid; 
    private Categorie categorieid; 

    public Appel() { 
    } 

    public Appel(Integer numOrdre, String reference, String objet, String organisme, Date dateParution, Date heureParution, Date dateLimite) { 
     this.numOrdre = numOrdre; 
     this.reference = reference; 
     this.objet = objet; 
     this.organisme = organisme; 
     this.dateParution = dateParution; 
     this.heureParution = heureParution; 
     this.dateLimite = dateLimite; 
    } 

đây là ths json trả về bởi API của tôi

[ 
    { 
     "numOrdre": 918272, 
     "reference": "some text", 
     "objet": "some text", 
     "organisme": "some text", 
     "budget": 3000000, 
     "caution": 3000000, 
     "dateParution": 1382828400000, 
     "heureParution": 59400000, 
     "dateLimite": 1389657600000, 
     "heureLimite": 34200000, 
     "supportList": 
     [ 
      { 
       "id": 1, 
       "nom": "some text", 
       "dateSupport": 1384732800000, 
       "pgCol": "013/01" 
      }, 
      { 
       "id": 2, 
       "nom": "some text", 
       "dateSupport": 1380236400000, 
       "pgCol": "011/01" 
      } 
     ], 
     "villeid": 
     { 
      "id": 2, 
      "nom": "Ville", 
      "paysid": 
      { 
       "id": 1, 
       "nom": "Pays" 
      } 
     }, 
     "categorieid": 
     { 
      "id": 1, 
      "description": "some text" 
     } 
    }, 
    ..... 
] 
+0

Json của bạn trông như thế nào? Pojo của bạn trông như thế nào? –

+0

Bạn đang cố gắng truyền một thời gian dài. – rpax

+0

Các giá trị đó, '1384732800000', có vẻ như dấu thời gian. Gson không được thiết lập để phân tích cú pháp các ngày có dấu thời gian. Bạn sẽ phải cấu hình nó với một 'TypeAdapter' tùy chỉnh. –

Trả lời

4

gì Cuối cùng tôi đã thực hiện dự án API của mình và tạo một CustomSerializer

public class CustomDateSerializer extends JsonSerializer<Date> { 

    @Override 
    public void serialize(Date t, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException { 
     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
     String formattedDate = formatter.format(t); 

     jg.writeString(formattedDate); 
    } 
} 

trả lại các trường ngày định dạng yyyy-MM-dd và tôi chú thích với

@JsonSerialize(using = CustomDateSerializer.class) 

trong ứng dụng Android của tôi Tôi tạo ra đối tượng Gson như

  Reader reader = new InputStreamReader(content); 

      GsonBuilder gsonBuilder = new GsonBuilder(); 
      gsonBuilder.setDateFormat("yyyy-MM-dd"); 
      Gson gson = gsonBuilder.create(); 
      appels = Arrays.asList(gson.fromJson(reader, Appel[].class)); 
      content.close(); 

và nó hoạt động cho bây giờ .. cảm ơn vì bạn giúp tôi đánh giá cao nó

+0

Nơi viết @JsonSerialize này (sử dụng = CustomDateSerializer.class) – KJEjava48

+1

Không cần thiết phải tạo Trình tùy chỉnh nối tiếp nữa.Xem ở đây để biết ví dụ: http://stackoverflow.com/a/34187419/1103584 – DiscDev

0

Giá trị 1382828400000 là một chặng đường dài (thời gian trong mili giây). Bạn đang nói với GSON rằng trường là Date và trường đó không thể tự động chuyển đổi long thành Date.

Bạn cần phải xác định các lĩnh vực của bạn như các giá trị dài

private long dateParution; 
private long heureParution; 
private long dateLimite; 
private long heureLimite; 

và sau GSON phôi chuỗi JSON để mong muốn Appel dụ lớp, xây dựng một đối tượng với những lĩnh vực như Ngày và chuyển đổi chúng khi gán các giá trị để đối tượng mới.

Một thay thế là thực hiện của riêng bạn Tuỳ chỉnh deserializer:

public class CustomDateDeserializer extends DateDeserializer { 
    @Override 
    public Date deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException { 
     // get the value from the JSON 
     long timeInMilliseconds = Long.parseLong(jsonParser.getText()); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(timeInMilliseconds); 
     return calendar.getTime(); 
    } 
} 

Bạn phải thiết lập deserializer tùy chỉnh này trên lĩnh vực mong muốn của bạn, về các phương pháp setter, như:

@JsonDeserialize(using=CustomDateDeserializer.class) 
public void setDateParution(Date dateParution) { 
    this.dateParution = dateParution; 
} 
4

Công cụ nối tiếp tùy chỉnh không còn cần thiết - chỉ cần sử dụng GsonBuilder và chỉ định định dạng ngày, như vậy:

Timestamp t = new Timestamp(System.currentTimeMillis()); 

String json = new GsonBuilder() 
       .setDateFormat("yyyy-MM-dd hh:mm:ss.S") 
       .create() 
       .toJson(t); 

System.out.println(json); 
Các vấn đề liên quan