Как разрешить JsonReader.setLenient(true) принимать неверный формат JSON в строке 1, столбце 1, ошибка пути $ в Android?

Вот соответствующая часть моей установки 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, путь $

setLenient() на Gson позволяет более спокойно анализировать типы данных JSON, но это не влияет напрямую на то, как Retrofit обрабатывает искаженные структуры JSON. Ошибка предполагает, что проблема связана с общей структурой ответа JSON, а не с проблемами типа данных. Если вы поделитесь конкретным сообщением об ошибке или фрагментом искаженного JSON, возможно, я смогу предоставить более конкретные рекомендации.
Bob 28.06.2024 05:41

Команды [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 ]

selfish rui 28.06.2024 06:14

я предлагаю проверить модель, модель неправильно сопоставлена

Faisal Naseer 28.06.2024 06:50
0
3
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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. Теперь я знаю, как это изменить. Большое спасибо за Вашу помощь.

selfish rui 28.06.2024 09:58

пожалуйста, можете ли вы принять мой ответ, поскольку ваша проблема решена, поэтому другие также могут получить выгоду от принятия вашего ответа

Sohaib Ahmed 28.06.2024 12:43

Конечно, я прошу прощения за опоздание.

selfish rui 03.07.2024 10:02

Нет проблем, и спасибо

Sohaib Ahmed 03.07.2024 13:06

Другие вопросы по теме