Java 如何修复';JsonSyntaxException';日期转换时

Java 如何修复';JsonSyntaxException';日期转换时,java,android,date,gson,retrofit2,Java,Android,Date,Gson,Retrofit2,我正在从事一个项目,该项目通过HTTPS POST请求将数据导入Web服务。为了创建HTTPS请求,我使用了第2种方法。 这是我关于如何创建请求和评估响应的方法: 我正在创建一个存储信息的对象 我调用对象的一个方法,该方法将数据转换为请求的适当格式(JSON格式) 我创建了改造客户端并打了个电话 最后一点是评估响应(此时它跳过onResponse()方法,并使用JsonSyntaxException输入onFailure()方法) 我已经尝试了DateDeserializer…不幸的是没有任何结

我正在从事一个项目,该项目通过HTTPS POST请求将数据导入Web服务。为了创建HTTPS请求,我使用了第2种方法。 这是我关于如何创建请求和评估响应的方法:

  • 我正在创建一个存储信息的对象
  • 我调用对象的一个方法,该方法将数据转换为请求的适当格式(JSON格式)
  • 我创建了改造客户端并打了个电话
  • 最后一点是评估响应(此时它跳过onResponse()方法,并使用JsonSyntaxException输入onFailure()方法)
  • 我已经尝试了DateDeserializer…不幸的是没有任何结果

    这是请求的格式:

    tokenid=ABCDEFG
    &bookuser=testuser
    &input= {
        "0": {
            "ISSUEKEY": "ABC-81",
            "STARTDATE": "15.12.2016 09:00",
            "ENDDATE": "15.12.2016 11:30",
            "BOOKINGTEXT": "Testeintrag 1. Stephan Perner ISSUEKEY, ohne Sekunden"
        },
        "1": {
            "ISSUEKEY": "ABC-82",
            "STARTDATE": "15.12.2016 12:00",
            "ENDDATE": "15.12.2016 17:45",
            "BOOKINGTEXT": "Testeintrag 2. Stephan Perner, ohne Sekunden"
        }
    }
    
    这是当我按下按钮以启动发送过程时将调用的方法:

    
            w.setBookingtext("testeintrag#2");
            System.out.println("String: " + w.toRequest());
            String token = loadToken();
            Log.e(TAG, token);
    
            Call call = jiraService.postWorktime(token, "mschwar", "{\"0\":" + w.toRequest() + "}");
    
    这是我为填写POST请求正文而创建的改装库的调用:

        @POST("postWorktime")
        Call<PostWorkTimeResponse> postWorktime(@Field("tokenid") String token, @Field("bookuser") String bookuser, @Field("input") String input);
    
    这是我实现回调接口的类:

    package com.ssi.zeiterfassungsapp.webservice;
    
    import android.content.Context;
    import android.util.Log;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.google.gson.reflect.TypeToken;
    import com.ssi.zeiterfassungsapp.beans.PostWorkTimeRelated.PostWorkTimeResponse;
    import com.ssi.zeiterfassungsapp.util.AsyncDelegate;
    
    import java.lang.reflect.Type;
    
    import retrofit2.Call;
    import retrofit2.Callback;
    import retrofit2.Response;
    
    public class WorktimeImporter implements Callback
    {
        private static final String TAG = "WorktimeImporter";
        private Context mContext;
        private AsyncDelegate delegate;
        private Gson gson;
    
        public WorktimeImporter(Context mContext, AsyncDelegate delegate) {
            this.mContext = mContext;
            this.delegate = delegate;
            gson = new GsonBuilder().setLenient().serializeNulls().setDateFormat("dd.MM.yyyy HH:mm").create();
        }
    
        @Override
        public void onResponse(Call call, Response response) {
            Type type = new TypeToken<PostWorkTimeResponse>(){}.getType(); //Creates instance of the Type (PostWorkTimeResponse)
            PostWorkTimeResponse workTimeResponse = null;
            Log.e(TAG, "Error in onResponse()");
            if(response.code() == 200){
                workTimeResponse = (PostWorkTimeResponse) response.body();
    
            }else
            {
                try {
                    workTimeResponse = gson.fromJson(response.errorBody().string(), type); //Converts the response to LoginResponse
                    Log.e(TAG, response.errorBody().string());
                } catch (Exception e) {
                    Log.e(TAG, "Error: " + e.getMessage());
                }
            }
            Log.e(TAG, workTimeResponse.toString());
        }
    
        @Override
        public void onFailure(Call call, Throwable t) {
            t.printStackTrace();
        }
    }
    
    我希望有人能在这个问题上帮助我,我是一个比较新的改装者,并向Webservices提出请求。提前谢谢你,我会非常感谢你的帮助

    请求的响应应如下所示:

    {
    "status": "Ok",
    "token": "ABCDEFG",
    "user": "testuser",
    "origin": "XXX",
    "target": "IF",
    "bookuser": "testuser",
    "booking": 
    {
    0: 
    {
    "ISSUEKEY": "ABC-81",
    "STARTDATE": "15.12.2016 09:00",
    "ENDDATE": "15.12.2016 11:30",
    "BOOKINGTEXT": "Testeintrag 1. Stephan Perner auf korrekten ISSUEKEY, ohne Sekunden"
    }
    ,
    1: 
    {
    "ISSUEKEY": "ABC-82",
    "STARTDATE": "15.12.2016 12:00",
    "ENDDATE": "15.12.2016 17:45",
    "BOOKINGTEXT": "Testeintrag 2. Stephan Perner auf korrekten ISSUEKEY, ohne Sekunden"
    }
    }
    }
    

    您可以像下面这样更新pojo

    public class Worktime
    {
    
        @SerializedName("ISSUEKEY")
        private String projectKey;
        @SerializedName("STARTDATE")
        private String from;
        @SerializedName("ENDDATE")
        private String to;
        @SerializedName("BOOKINGTEXT")
        private String bookingtext;
    
        public Worktime(String from, String to, String projectKey) {
            this.from = from;
            this.to = to;
            this.projectKey = projectKey;
        }
    
        public String getFrom() {
            return from;
        }
    
        public String getFromAsDate() {
           try {
            return new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.GERMANY).parse(from);
           } catch (Exception e) {
    
            }
            return null;
        }
    
        public void setFrom(Date from) {
            this.from = from;
        }
    
        public String getTo() {
            return to;
        }
    
        public String getToAsDate() {
           try {
            return new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.GERMANY).parse(to);
           } catch (Exception e) {
    
            }
            return null;
        }
    
        public void setTo(String to) {
            this.to = to;
        }
    
        public String getProjectKey() {
            return projectKey;
        }
    
        public void setProjectKey(String projectKey) {
            this.projectKey = projectKey;
        }
    
        public String getBookingtext() {
            return bookingtext;
        }
    
        public void setBookingtext(String bookingtext) {
            this.bookingtext = bookingtext;
        }
    
        @Override
        public String toString() {
            return "Worktime{" +
                    "from=" + from +
                    ", to=" + to +
                    ", projectKey='" + projectKey + '\'' +
                    ", bookingtext='" + bookingtext + '\'' +
                    '}';
        }
    
        public String toRequest()
        {
            SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.GERMANY);
            Date dStart = from;
            Date dEnd = to;
            dEnd.setHours(15);
            return String.format("{" +
                            "\"ISSUEKEY\":\"%s\"," +
                            "\"STARTDATE\":\"%s\"," +
                            "\"ENDDATE\":\"%s\"," +
                    "\"BOOKINGTEXT\":\"%s\"" +
                                   "}", projectKey, df.format(dStart), df.format(dEnd), bookingtext);
        }
    }
    

    您可以从
    getFromAsDate()和
    getToAsDate()获取startdate和enddate作为对象

    您必须将
    STARTDATE
    ENDDATE
    声明为字符串。然后,您可以在需要时将日期转换为
    ENDDATE
    STARTDATE
    是字符串您使用的日期时间类非常糟糕,多年前被JSR 310中定义的现代java.time类所取代。
    {
    "status": "Ok",
    "token": "ABCDEFG",
    "user": "testuser",
    "origin": "XXX",
    "target": "IF",
    "bookuser": "testuser",
    "booking": 
    {
    0: 
    {
    "ISSUEKEY": "ABC-81",
    "STARTDATE": "15.12.2016 09:00",
    "ENDDATE": "15.12.2016 11:30",
    "BOOKINGTEXT": "Testeintrag 1. Stephan Perner auf korrekten ISSUEKEY, ohne Sekunden"
    }
    ,
    1: 
    {
    "ISSUEKEY": "ABC-82",
    "STARTDATE": "15.12.2016 12:00",
    "ENDDATE": "15.12.2016 17:45",
    "BOOKINGTEXT": "Testeintrag 2. Stephan Perner auf korrekten ISSUEKEY, ohne Sekunden"
    }
    }
    }
    
    public class Worktime
    {
    
        @SerializedName("ISSUEKEY")
        private String projectKey;
        @SerializedName("STARTDATE")
        private String from;
        @SerializedName("ENDDATE")
        private String to;
        @SerializedName("BOOKINGTEXT")
        private String bookingtext;
    
        public Worktime(String from, String to, String projectKey) {
            this.from = from;
            this.to = to;
            this.projectKey = projectKey;
        }
    
        public String getFrom() {
            return from;
        }
    
        public String getFromAsDate() {
           try {
            return new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.GERMANY).parse(from);
           } catch (Exception e) {
    
            }
            return null;
        }
    
        public void setFrom(Date from) {
            this.from = from;
        }
    
        public String getTo() {
            return to;
        }
    
        public String getToAsDate() {
           try {
            return new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.GERMANY).parse(to);
           } catch (Exception e) {
    
            }
            return null;
        }
    
        public void setTo(String to) {
            this.to = to;
        }
    
        public String getProjectKey() {
            return projectKey;
        }
    
        public void setProjectKey(String projectKey) {
            this.projectKey = projectKey;
        }
    
        public String getBookingtext() {
            return bookingtext;
        }
    
        public void setBookingtext(String bookingtext) {
            this.bookingtext = bookingtext;
        }
    
        @Override
        public String toString() {
            return "Worktime{" +
                    "from=" + from +
                    ", to=" + to +
                    ", projectKey='" + projectKey + '\'' +
                    ", bookingtext='" + bookingtext + '\'' +
                    '}';
        }
    
        public String toRequest()
        {
            SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.GERMANY);
            Date dStart = from;
            Date dEnd = to;
            dEnd.setHours(15);
            return String.format("{" +
                            "\"ISSUEKEY\":\"%s\"," +
                            "\"STARTDATE\":\"%s\"," +
                            "\"ENDDATE\":\"%s\"," +
                    "\"BOOKINGTEXT\":\"%s\"" +
                                   "}", projectKey, df.format(dStart), df.format(dEnd), bookingtext);
        }
    }