Вот соответствующая часть моей установки Retrofit:
package com.example.android2024.axios;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class api {
private static String token;
public static String getToken() {
return token;
}
public static void setToken(String token) {
api.token = token;
}
public static <T> T getService(Class<T> serviceClass){
// 请求响应拦截器
HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
System.out.println(message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient=new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("http://172.20.4.47:8080/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit.create(serviceClass);
}
}
введите сюда описание изображения
введите сюда описание изображения
Я попытался перевести экземпляр Gson
в щадящий режим в настройке Retrofit, выполнив следующие действия:
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://example.com/")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
Несмотря на то, что экземпляр Gson переведен в мягкий режим, приложение по-прежнему выдает ту же ошибку: Используйте JsonReader.setLenient(true), чтобы принять неверный формат JSON в строке 1, столбце 1, путь $
Команды [Hash = -473957050, id=11, tl=1.0, th=1.0, sun=1.0, Day=1, all1=1, Light2=1, Light1=1, Time=1, St=1, SerialVersionUID=1 ]
я предлагаю проверить модель, модель неправильно сопоставлена
Кажется, что ваш результат имеет форму строки, а не JSON. Для ответа string
мы используем ScalarsConverterFactory
в Retrofit Builder.
Шаг 1
Добавить зависимость
implementation("com.squareup.retrofit2:converter-scalars:2.11.0") // for kotlin
implementation 'com.squareup.retrofit2:converter-scalars:2.11.0' // for groovy
Удалите GsonConverterFactory
и добавьте ScalarsConverterFactory
следующим образом.
public static <T> T getService(Class<T> serviceClass){
// 请求响应拦截器
HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
System.out.println(message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient=new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("http://172.20.4.47:8080/")
.client(okHttpClient)
.addConverterFactory(ScalarsConverterFactory.create()) // <- Change
.build();
return retrofit.create(serviceClass);
}
О, действительно, это правда. На стороне сервера тип возвращаемого значения — String. Теперь я знаю, как это изменить. Большое спасибо за Вашу помощь.
пожалуйста, можете ли вы принять мой ответ, поскольку ваша проблема решена, поэтому другие также могут получить выгоду от принятия вашего ответа
Конечно, я прошу прощения за опоздание.
Нет проблем, и спасибо
setLenient()
на Gson позволяет более спокойно анализировать типы данных JSON, но это не влияет напрямую на то, как Retrofit обрабатывает искаженные структуры JSON. Ошибка предполагает, что проблема связана с общей структурой ответа JSON, а не с проблемами типа данных. Если вы поделитесь конкретным сообщением об ошибке или фрагментом искаженного JSON, возможно, я смогу предоставить более конкретные рекомендации.