Java &引用;JsonParseException:不可解析的日期:";-安卓错误

Java &引用;JsonParseException:不可解析的日期:";-安卓错误,java,android,rest,gson,retrofit,Java,Android,Rest,Gson,Retrofit,我正在开发一个android应用程序,它连接到我开发的RESTAPI。我使用Jersey和Hibernate开发了restapi。在这个API中,我有一个名为findPatientById的方法。下面是它的代码 休息通话 ---- @GET @Path("/findPatientById/{idPatient}") @Produces(MediaType.APPLICATION_JSON) public Patient findPatientById(@PathPa

我正在开发一个android应用程序,它连接到我开发的RESTAPI。我使用
Jersey
Hibernate
开发了restapi。在这个API中,我有一个名为
findPatientById
的方法。下面是它的代码

休息通话 ----

   @GET
    @Path("/findPatientById/{idPatient}")
    @Produces(MediaType.APPLICATION_JSON)
    public Patient findPatientById(@PathParam("idPatient")int idPatient){

        PatientService patientService = new PatientService();
        Patient patient = patientService.findPatientById(idPatient);
        return patient;       
    }
public Patient findPatientById(int idPatient, Session session) {
        Patient patient = (Patient) session.get(Patient.class, idPatient);
        return patient;
    }
public Patient findPatientById(int idPatient) {
        Session session = patientDAOInterface.openCurrentSession();
        Transaction transaction = null;

        Patient patient = new Patient();
        try {
            transaction = patientDAOInterface.openTransaction(session);
            patient = patientDAOInterface.findPatientById(idPatient, session);
            System.out.println("DATE CREATED - "+patient.getDateCreated());
            transaction.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            session.close();

            Language language = new Language();
            if (patient.getLanguage() != null) {
                Integer idlanguage = patient.getLanguage().getIdlanguage();
                language.setIdlanguage(idlanguage);
                patient.setLanguage(language);
            }

            if (patient.getDiabetesType() != null) {
                DiabetesType diabetesType = new DiabetesType();
                Integer iddiabetesType = patient.getDiabetesType().getIddiabetesType();
                diabetesType.setIddiabetesType(iddiabetesType);
                patient.setDiabetesType(diabetesType);
            }            

           // patient.setDateCreated(null);
          //  patient.setLastUpdated(null);
        }
        return patient;
    }
数据库层 ---

   @GET
    @Path("/findPatientById/{idPatient}")
    @Produces(MediaType.APPLICATION_JSON)
    public Patient findPatientById(@PathParam("idPatient")int idPatient){

        PatientService patientService = new PatientService();
        Patient patient = patientService.findPatientById(idPatient);
        return patient;       
    }
public Patient findPatientById(int idPatient, Session session) {
        Patient patient = (Patient) session.get(Patient.class, idPatient);
        return patient;
    }
public Patient findPatientById(int idPatient) {
        Session session = patientDAOInterface.openCurrentSession();
        Transaction transaction = null;

        Patient patient = new Patient();
        try {
            transaction = patientDAOInterface.openTransaction(session);
            patient = patientDAOInterface.findPatientById(idPatient, session);
            System.out.println("DATE CREATED - "+patient.getDateCreated());
            transaction.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            session.close();

            Language language = new Language();
            if (patient.getLanguage() != null) {
                Integer idlanguage = patient.getLanguage().getIdlanguage();
                language.setIdlanguage(idlanguage);
                patient.setLanguage(language);
            }

            if (patient.getDiabetesType() != null) {
                DiabetesType diabetesType = new DiabetesType();
                Integer iddiabetesType = patient.getDiabetesType().getIddiabetesType();
                diabetesType.setIddiabetesType(iddiabetesType);
                patient.setDiabetesType(diabetesType);
            }            

           // patient.setDateCreated(null);
          //  patient.setLastUpdated(null);
        }
        return patient;
    }
服务层 ----

   @GET
    @Path("/findPatientById/{idPatient}")
    @Produces(MediaType.APPLICATION_JSON)
    public Patient findPatientById(@PathParam("idPatient")int idPatient){

        PatientService patientService = new PatientService();
        Patient patient = patientService.findPatientById(idPatient);
        return patient;       
    }
public Patient findPatientById(int idPatient, Session session) {
        Patient patient = (Patient) session.get(Patient.class, idPatient);
        return patient;
    }
public Patient findPatientById(int idPatient) {
        Session session = patientDAOInterface.openCurrentSession();
        Transaction transaction = null;

        Patient patient = new Patient();
        try {
            transaction = patientDAOInterface.openTransaction(session);
            patient = patientDAOInterface.findPatientById(idPatient, session);
            System.out.println("DATE CREATED - "+patient.getDateCreated());
            transaction.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            session.close();

            Language language = new Language();
            if (patient.getLanguage() != null) {
                Integer idlanguage = patient.getLanguage().getIdlanguage();
                language.setIdlanguage(idlanguage);
                patient.setLanguage(language);
            }

            if (patient.getDiabetesType() != null) {
                DiabetesType diabetesType = new DiabetesType();
                Integer iddiabetesType = patient.getDiabetesType().getIddiabetesType();
                diabetesType.setIddiabetesType(iddiabetesType);
                patient.setDiabetesType(diabetesType);
            }            

           // patient.setDateCreated(null);
          //  patient.setLastUpdated(null);
        }
        return patient;
    }
下面是患者Bean

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

    public class Patient implements java.io.Serializable {

        private Integer idpatient;
        private DiabetesType diabetesType;
        private Language language;
        private String customId;
        private String diabetesOther;
        private String firstName;
        private String lastName;
        private String email;
        private Date dob;
        private String parentEmail;
        private String gender;
        private Date diagnosedDate;
        private Double height;
        private Double weight;
        private String heightUnit;
        private String weightUnit;
        private String theme;
        private String userName;
        private String password;
        private Date dateCreated;
        private Date lastUpdated;

        public Patient() {
        }

        public Patient(DiabetesType diabetesType, Language language, String customId, String firstName, String email, Date dob, String gender, String theme, String userName, String password, Date lastUpdated) {
            this.diabetesType = diabetesType;
            this.language = language;
            this.customId = customId;
            this.firstName = firstName;
            this.email = email;
            this.dob = dob;
            this.gender = gender;
            this.theme = theme;
            this.userName = userName;
            this.password = password;
            this.lastUpdated = lastUpdated;
        }

        public Patient(DiabetesType diabetesType, Language language, String customId, String diabetesOther, String firstName, String lastName, String email, Date dob, String parentEmail, String gender, Date diagnosedDate, Double height, Double weight, String heightUnit, String weightUnit, String theme, String userName, String password, Date dateCreated, Date lastUpdated) {
            this.diabetesType = diabetesType;
            this.language = language;
            this.customId = customId;
            this.diabetesOther = diabetesOther;
            this.firstName = firstName;
            this.lastName = lastName;
            this.email = email;
            this.dob = dob;
            this.parentEmail = parentEmail;
            this.gender = gender;
            this.diagnosedDate = diagnosedDate;
            this.height = height;
            this.weight = weight;
            this.heightUnit = heightUnit;
            this.weightUnit = weightUnit;
            this.theme = theme;
            this.userName = userName;
            this.password = password;
            this.dateCreated = dateCreated;
            this.lastUpdated = lastUpdated;
        }

        public Integer getIdpatient() {
            return this.idpatient;
        }

        public void setIdpatient(Integer idpatient) {
            this.idpatient = idpatient;
        }

        public DiabetesType getDiabetesType() {
            return this.diabetesType;
        }

        public void setDiabetesType(DiabetesType diabetesType) {
            this.diabetesType = diabetesType;
        }

        public Language getLanguage() {
            return this.language;
        }

        public void setLanguage(Language language) {
            this.language = language;
        }

        public String getCustomId() {
            return this.customId;
        }

        public void setCustomId(String customId) {
            this.customId = customId;
        }

        public String getDiabetesOther() {
            return this.diabetesOther;
        }

        public void setDiabetesOther(String diabetesOther) {
            this.diabetesOther = diabetesOther;
        }

        public String getFirstName() {
            return this.firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return this.lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getEmail() {
            return this.email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public Date getDob() {
            return this.dob;
        }

        public void setDob(Date dob) {
            this.dob = dob;
        }

        public String getParentEmail() {
            return this.parentEmail;
        }

        public void setParentEmail(String parentEmail) {
            this.parentEmail = parentEmail;
        }

        public String getGender() {
            return this.gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }

        public Date getDiagnosedDate() {
            return this.diagnosedDate;
        }

        public void setDiagnosedDate(Date diagnosedDate) {
            this.diagnosedDate = diagnosedDate;
        }

        public Double getHeight() {
            return this.height;
        }

        public void setHeight(Double height) {
            this.height = height;
        }

        public Double getWeight() {
            return this.weight;
        }

        public void setWeight(Double weight) {
            this.weight = weight;
        }

        public String getHeightUnit() {
            return this.heightUnit;
        }

        public void setHeightUnit(String heightUnit) {
            this.heightUnit = heightUnit;
        }

        public String getWeightUnit() {
            return this.weightUnit;
        }

        public void setWeightUnit(String weightUnit) {
            this.weightUnit = weightUnit;
        }

        public String getTheme() {
            return this.theme;
        }

        public void setTheme(String theme) {
            this.theme = theme;
        }

        public String getUserName() {
            return this.userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public String getPassword() {
            return this.password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public Date getDateCreated() {
            return this.dateCreated;
        }

        public void setDateCreated(Date dateCreated) {
            this.dateCreated = dateCreated;
        }

        public Date getLastUpdated() {
            return this.lastUpdated;
        }

        public void setLastUpdated(Date lastUpdated) {
            this.lastUpdated = lastUpdated;
        }

    }
好的,当我调用这个REST方法时,我得到下面的
JSON
输出

{
  "idpatient": 86,
  "diabetesType": null,
  "language": null,
  "customId": "CUS790",
  "diabetesOther": null,
  "firstName": "Nirodha",
  "lastName": "Wije",
  "email": "ni00@gmail.com",
  "dob": "2005-10-16",
  "parentEmail": "niaasa500@gmail.com",
  "gender": "male",
  "diagnosedDate": "2016-11-16",
  "height": 0,
  "weight": 0,
  "heightUnit": null,
  "weightUnit": null,
  "theme": "Lite",
  "userName": "ranja",
  "password": "N1YL3+M0lnORHnKk0dPN8HYd1IBhWKAGO9Qsop7POgw=",
  "dateCreated": 1479311638000,
  "lastUpdated": 1479311638000
}
现在,我正在从我的android应用程序连接上述方法,我正在使用
reformation
来处理剩余的API工作。下面是相关的android代码

private Patient restcallGetPatient(int idPatient){
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Date.class, new DateTypeDeserializer());
    Gson gson = gsonBuilder.create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(RestCommon.URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    PatientEndPoint endPoint = retrofit.create(PatientEndPoint.class);
    Call<Patient> call = endPoint.findPatientById(idPatient);
    call.enqueue(new Callback<Patient>() {
        @Override
        public void onResponse(Response<Patient> response, Retrofit retrofit) {
            patients=response.body();

            Log.d("PROFILE_USER"," PATIENT_DETAILS "+patients.getFirstName());
        }

        @Override
        public void onFailure(Throwable t) {
            t.printStackTrace();
            Log.d("PROFILE_USER"," PATIENT_ERROR "+t.getMessage());
        }
    });

    return patients;
}
现在,当我执行这个android代码时,我得到了下面的异常

11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: com.google.gson.JsonParseException: Unparseable date: "1479317839000". Supported formats: 
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: [yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss, yyyy-MM-dd, EEE MMM dd HH:mm:ss z yyyy, HH:mm:ss, MM/dd/yyyy HH:mm:ss aaa, yyyy-MM-dd'T'HH:mm:ss.SSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z', MMM d',' yyyy H:mm:ss a]
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at xxx.com.au.xyz.activities.ProfileUserActivity$DateTypeDeserializer.deserialize(ProfileUserActivity.java:474)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at xxx.com.au.xyz.activities.ProfileUserActivity$DateTypeDeserializer.deserialize(ProfileUserActivity.java:451)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:810)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:775)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at retrofit.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:36)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at retrofit.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:24)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:148)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at retrofit.OkHttpCall.access$100(OkHttpCall.java:29)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at retrofit.OkHttpCall$1.onResponse(OkHttpCall.java:94)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-16 17:37:42.043 6534-6534/xxx.com.au.xyz W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-16 17:37:42.043 6534-6534/xxx.com.au.xyz W/System.err:     at java.lang.Thread.run(Thread.java:818)
11-16 17:37:42.043 6534-6534/xxx.com.au.xyz D/PROFILE_USER:  PATIENT_ERROR Unparseable date: "1479317839000". Supported formats: 
                                                                        [yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss, yyyy-MM-dd, EEE MMM dd HH:mm:ss z yyyy, HH:mm:ss, MM/dd/yyyy HH:mm:ss aaa, yyyy-MM-dd'T'HH:mm:ss.SSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z', MMM d',' yyyy H:mm:ss a]
11-16 17:37:42.053 6534-6534/xxx.com.au.xyz I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@b3857a0 time:13147437
好的,现在有非常重要的事情要注意。它们在下面

  • Patient
    bean中的
    lastUpdated
    dateCreated
    是数据库中的
    Timestamp
    。在NetBeans中,我为
    Hibernate
    自动生成了POJO,它们在bean中被创建为
    java.util.Date
    dob
    是数据库和bean中的
    Date
    对象

  • 我正在使用Mysql数据库

  • 因此,由于上述异常,我不可能在android应用程序中使用REST调用从数据库检索bean。我很确定这是由于rest调用返回的两种不同的
    date
    格式造成的,但这应该得到处理,这就是我应用自定义
    GSON
    转换器的原因。但是没有用,我得到了同样的例外。我研究了大量的解决方案,这些解决方案建议以各种方式构建定制的GSON转换器,但仍然没有效果


    如何解决此问题?

    在方法
    反序列化()中所有日期格式失败后,您可以尝试将JSON值转换为Long并返回
    新日期(valueAsLong)

    代替

    throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
                + "\". Supported formats: \n" + Arrays.toString(DATE_FORMATS));
    


    但我认为问题出在服务器端。它不应以毫秒为单位返回日期。

    尝试将实际日期放入日期格式化程序:

    Timestamp stamp = new Timestamp(jsonElement.getAsString());
          Date date = new Date(stamp.getTime());
    
    然后在此行中使用
    date

    return new SimpleDateFormat(format, Locale.US).parse(date);
    

    时间戳以毫秒为单位返回。无论如何,你能给我一个关于如何执行你在我的Android代码中建议的操作的代码示例吗?@PeakGen我在哪里添加了一个示例?