如何在 Retrofit 2 中得到畸形 JSON
How to get malformed JSON in Retrofit 2
我正在发送一个请求,但我收到了一个异常,即使请求成功(我正在与之交互的 API,在成功时发送一个 OTP)。
例外情况是:
com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 2 path $
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573)
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:575)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:349)
at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:346)
at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:256)
at retrofit.GsonConverter.fromBody(GsonConverter.java:42)
at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144)
at retrofit.OkHttpCall.access[=11=]0(OkHttpCall.java:25)
at retrofit.OkHttpCall.onResponse(OkHttpCall.java:90)
at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168)
at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
现在我怎么会看到格式错误的 JSON?为了知道 Json 对象是否格式错误,它是返回的对象(我希望它是一个字符串),还是我发送的对象。
如果这是一个微不足道的问题,请原谅我,截至本周,我才开始 Android 开发。
这是服务:
public static EnrollmentApiInterface getApiClient(){
if (EnrollmentRequest == null) {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
Request request = chain.request();
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
String body = buffer.readUtf8();
Log.println(10, TAG, body);
Log.i(TAG, "hello: " + response);
String bodyString = response.body().string();
Log.i(TAG, bodyString);
response = response.newBuilder()
.body(ResponseBody.create(response.body().contentType(), bodyString))
.build();
return response;
}
});
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
Retrofit retrofit = new Retrofit.Builder()
// .baseUrl("http://10.0.2.2:6543/") // On AVD
.baseUrl("http://192.168.0.106:6543") // On device
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
EnrollmentRequest = retrofit.create(EnrollmentApiInterface.class);
}
return EnrollmentRequest;
}
接口:
public interface EnrollmentApiInterface {
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@POST("auth/enroll")
Call<String> RequestEnrollment(@Body JsonObject EnrollmentDetails);
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@POST("auth/enroll/auth")
Call<String> AuthoriseEnrollment(@Body JsonObject LoginDetails);
}
}
这是调用:
EnrollmentRequest request = new EnrollmentRequest();
request.setMsisdn(MsisdnTxt.getText().toString());
request.setId_number(IdNumberTxt.getText().toString());
EnrollmentApiClient.EnrollmentApiInterface service = EnrollmentApiClient.getApiClient();
Log.i(TAG, "REQUEST: " + request.toJson());
Call<String> call = service.RequestEnrollment(request.toJson());
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response) {
Log.i(TAG, "ON RESPONSE" + response);
Log.i(TAG, "ON RESPONSE BODY" + response.body());
// Create object of SharedPreferences.
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(that);
//now get Editor
SharedPreferences.Editor editor = sharedPref.edit();
//put your value
editor.putString("IDnumber", IdNumberTxt.getText().toString());
editor.putString("Msisdn", MsisdnTxt.getText().toString());
//commits your edits
editor.commit();
Log.i(TAG, "onClick-AFTER");
Intent intent = new Intent(getApplicationContext(), AuthoriseActivity.class);
startActivity(intent);
}
@Override
public void onFailure(Throwable t) {
// It always comes in here
Log.i(TAG, "NOTHERE", t);
Log.d("CallBack", " Throwable is " + t.toString());
Toast.makeText(EnrollActivity.this, "Request Failed", Toast.LENGTH_LONG).show();
}
});
只需记录您的网络响应,这样您就会发现问题所在。
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
Log.w("Retrofit@Response", response.body().string());
return response;
}
使用字符串转换为 Retrofit restadapter
RestAdapter adapterRfqPost = new RestAdapter.Builder()
.setEndpoint(Constants.ENDPOINT)
.setConverter(new ConstantsMethods.StringConverter())
.build();
字符串转换器class
public static class StringConverter implements Converter {
@Override
public Object fromBody(TypedInput typedInput, Type type) throws ConversionException {
String text = null;
try {
text = fromStream(typedInput.in());
} catch (IOException ignored) {/*NOP*/ }
return text;
}
@Override
public TypedOutput toBody(Object o) {
return null;
}
public static String fromStream(InputStream in) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder out = new StringBuilder();
String newLine = System.getProperty("line.separator");
String line;
while ((line = reader.readLine()) != null) {
out.append(line);
out.append(newLine);`enter code here`
}`enter code here`
return out.toString();
}
}
我正在发送一个请求,但我收到了一个异常,即使请求成功(我正在与之交互的 API,在成功时发送一个 OTP)。
例外情况是:
com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 2 path $
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573)
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:575)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:349)
at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:346)
at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:256)
at retrofit.GsonConverter.fromBody(GsonConverter.java:42)
at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144)
at retrofit.OkHttpCall.access[=11=]0(OkHttpCall.java:25)
at retrofit.OkHttpCall.onResponse(OkHttpCall.java:90)
at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168)
at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
现在我怎么会看到格式错误的 JSON?为了知道 Json 对象是否格式错误,它是返回的对象(我希望它是一个字符串),还是我发送的对象。
如果这是一个微不足道的问题,请原谅我,截至本周,我才开始 Android 开发。
这是服务:
public static EnrollmentApiInterface getApiClient(){
if (EnrollmentRequest == null) {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
Request request = chain.request();
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
String body = buffer.readUtf8();
Log.println(10, TAG, body);
Log.i(TAG, "hello: " + response);
String bodyString = response.body().string();
Log.i(TAG, bodyString);
response = response.newBuilder()
.body(ResponseBody.create(response.body().contentType(), bodyString))
.build();
return response;
}
});
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
Retrofit retrofit = new Retrofit.Builder()
// .baseUrl("http://10.0.2.2:6543/") // On AVD
.baseUrl("http://192.168.0.106:6543") // On device
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
EnrollmentRequest = retrofit.create(EnrollmentApiInterface.class);
}
return EnrollmentRequest;
}
接口:
public interface EnrollmentApiInterface {
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@POST("auth/enroll")
Call<String> RequestEnrollment(@Body JsonObject EnrollmentDetails);
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@POST("auth/enroll/auth")
Call<String> AuthoriseEnrollment(@Body JsonObject LoginDetails);
}
}
这是调用:
EnrollmentRequest request = new EnrollmentRequest();
request.setMsisdn(MsisdnTxt.getText().toString());
request.setId_number(IdNumberTxt.getText().toString());
EnrollmentApiClient.EnrollmentApiInterface service = EnrollmentApiClient.getApiClient();
Log.i(TAG, "REQUEST: " + request.toJson());
Call<String> call = service.RequestEnrollment(request.toJson());
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response) {
Log.i(TAG, "ON RESPONSE" + response);
Log.i(TAG, "ON RESPONSE BODY" + response.body());
// Create object of SharedPreferences.
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(that);
//now get Editor
SharedPreferences.Editor editor = sharedPref.edit();
//put your value
editor.putString("IDnumber", IdNumberTxt.getText().toString());
editor.putString("Msisdn", MsisdnTxt.getText().toString());
//commits your edits
editor.commit();
Log.i(TAG, "onClick-AFTER");
Intent intent = new Intent(getApplicationContext(), AuthoriseActivity.class);
startActivity(intent);
}
@Override
public void onFailure(Throwable t) {
// It always comes in here
Log.i(TAG, "NOTHERE", t);
Log.d("CallBack", " Throwable is " + t.toString());
Toast.makeText(EnrollActivity.this, "Request Failed", Toast.LENGTH_LONG).show();
}
});
只需记录您的网络响应,这样您就会发现问题所在。
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
Log.w("Retrofit@Response", response.body().string());
return response;
}
使用字符串转换为 Retrofit restadapter
RestAdapter adapterRfqPost = new RestAdapter.Builder()
.setEndpoint(Constants.ENDPOINT)
.setConverter(new ConstantsMethods.StringConverter())
.build();
字符串转换器class
public static class StringConverter implements Converter {
@Override
public Object fromBody(TypedInput typedInput, Type type) throws ConversionException {
String text = null;
try {
text = fromStream(typedInput.in());
} catch (IOException ignored) {/*NOP*/ }
return text;
}
@Override
public TypedOutput toBody(Object o) {
return null;
}
public static String fromStream(InputStream in) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder out = new StringBuilder();
String newLine = System.getProperty("line.separator");
String line;
while ((line = reader.readLine()) != null) {
out.append(line);
out.append(newLine);`enter code here`
}`enter code here`
return out.toString();
}
}