com.google.gson.JsonSyntaxException when trying to parse Date/Time in json

前端 未结 3 1453
有刺的猬
有刺的猬 2021-01-11 09:17

I\'m using RestTemplete to get json data from a rest api and I\'m using Gson to parse data from json format to Object

Gson gson = new Gson();

restTemplate =         


        
相关标签:
3条回答
  • 2021-01-11 10:02

    What I've done finally is going to my API project and create a 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);
        }
    }
    

    that return the format yyyy-MM-dd and I annotated date fields with

    @JsonSerialize(using = CustomDateSerializer.class)
    

    in my Android application I created Gson object as

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

    and it works for now .. thanks for your help I appreciate it

    0 讨论(0)
  • 2021-01-11 10:04

    Custom Serializers are no longer necessary - simply use GsonBuilder, and specify the date format, as such:

    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);
    
    0 讨论(0)
  • 2021-01-11 10:06

    The 1382828400000 value is a long (time in milliseconds). You are telling GSON that the field is a Date, and it cannot automatically convert a long into a Date.

    You have to specify your fields as long values

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

    and after GSON casts the JSON string to the desired Appel class instance, construct another object with those fields as Dates and convert them while assigning the values to the new object.

    Another alternative is to implement your own Custom 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();
         }
     }
    

    You have to set this custom deserializer on your desired fields, on the setter methods, like:

    @JsonDeserialize(using=CustomDateDeserializer.class)
    public void setDateParution(Date dateParution) {
        this.dateParution = dateParution;
    }
    
    0 讨论(0)
提交回复
热议问题