Java 如何修复';JsonSyntaxException';日期转换时
我正在从事一个项目,该项目通过HTTPS POST请求将数据导入Web服务。为了创建HTTPS请求,我使用了第2种方法。 这是我关于如何创建请求和评估响应的方法:Java 如何修复';JsonSyntaxException';日期转换时,java,android,date,gson,retrofit2,Java,Android,Date,Gson,Retrofit2,我正在从事一个项目,该项目通过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);
}
}