当试图在json中parsingdate/时间时com.google.gson.JsonSyntaxException

我使用RestTemplete从restapi获取json数据,我使用Gson从json格式parsing数据到对象

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

但我得到这个问题与date,我该怎么做..

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

我的Pojo包含其他pojos在它的身体

 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; } 

这是我的API返回的json

 [ { "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" } }, ..... ] 

Solutions Collecting From Web of "当试图在json中parsingdate/时间时com.google.gson.JsonSyntaxException"

自定义序列化器不再是必要的 – 只需使用GsonBuilder,并指定date格式,如下所示:

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

我最终做的是去我的API项目,并创build一个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); } } 

返回格式为yyyy-MM-dd和我注释的date字段

 @JsonSerialize(using = CustomDateSerializer.class) 

在我的Android应用程序中,我创build了Gson对象

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

它现在的作品..感谢您的帮助,我很感激

1382828400000值很长(以毫秒为单位)。 您正在告诉GSON该字段是Date ,并且不能自动将long转换为Date

您必须将您的字段指定为长整型值

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

GSON将JSONstring强制转换为所需的Appel类实例之后,将这些字段作为date构造另一个对象,并在将值分配给新对象时将其转换。

另一种select是实现您自己的自定义解串器:

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

你必须设置这个自定义的反序列化器在你想要的领域,在设置方法,如:

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