47 votos

Utilice JsonReader.setLenient(true) para aceptar JSON mal formado en la línea 1, columna 1, ruta $.

¿Cuál es este error ? ¿Cómo puedo solucionarlo? Mi aplicación se está ejecutando pero no puede cargar datos. Y este es mi error: Use JsonReader.setLenient(true) para aceptar JSON mal formado en la línea 1 columna 1 ruta $

Este es mi fragmento :

public class news extends Fragment {

private RecyclerView recyclerView;
private ArrayList data;
private DataAdapter adapter;
private View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    myFragmentView = inflater.inflate(R.layout.news, container, false);
    initViews();
    return myFragmentView;

}

private void initViews() {
    recyclerView = (RecyclerView) myFragmentView.findViewById(R.id.card_recycler_view);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(layoutManager);
    data = new ArrayList();
    adapter = new DataAdapter(getActivity(), data);
    recyclerView.setAdapter(adapter);

    new Thread()
    {
        public void run()
        {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    loadJSON();
                }
            });

        }
    }
    .start();
}

private void loadJSON() {
    if (isNetworkConnected()){

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .retryOnConnectionFailure(true)
                .connectTimeout(15, TimeUnit.SECONDS)
                .build();

        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.memaraneha.ir/")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        RequestInterface request = retrofit.create(RequestInterface.class);
        Call call = request.getJSON();
        final ProgressDialog progressDialog = new ProgressDialog(getActivity());
        progressDialog.show();
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                progressDialog.dismiss();
                JSONResponse jsonResponse = response.body();
                data.addAll(Arrays.asList(jsonResponse.getAndroid()));
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onFailure(Call call, Throwable t) {
                progressDialog.dismiss();
                Log.d("Error", t.getMessage());
            }
        });
    }
    else {
        Toast.makeText(getActivity().getApplicationContext(), "Internet is disconnected", Toast.LENGTH_LONG).show();}
}
private boolean isNetworkConnected() {
    ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo ni = cm.getActiveNetworkInfo();
    if (ni == null) {
        // There are no active networks.
        return false;
    } else
        return true;
}
}

RequestInterface :

public interface RequestInterface {

@GET("Erfan/news.php")
Call getJSON();
}

a

ACTUALIZACIÓN (lee el texto a continuación y encuentra tu problema)

  • La mayoría de las veces, este error no se trata de tu JSON sino que podría ser un solicitud HTTP incorrecta como un encabezado faltante o incorrecto, primero verifica tu solicitud con Postman para verificar la respuesta del servidor y los encabezados de respuesta del servidor. si no hay nada mal, entonces el error proviene principalmente de tu solicitud HTTP programada, también podría ser porque la respuesta del servidor no es JSON (en algunos casos la respuesta podría ser HTML).

82voto

Amir Puntos 4769

Este es un problema bien conocido y basado en esta respuesta podrías agregar setLenient:

Gson gson = new GsonBuilder()
        .setLenient()
        .create();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();

Ahora, si agregas esto a tu retrofit, te da otro error:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

Este es otro error bien conocido, puedes encontrar la respuesta aquí (este error significa que la respuesta de tu servidor no está bien formateada); Así que cambia la respuesta del servidor para devolver algo como:

{
    android:[
        { ver:"1.5", name:"Cupcace", api:"Api Level 3" }
        ...
    ]
}

Para una mejor comprensión, compara tu respuesta con la API de Github.

Sugerencia: para averiguar qué está pasando con tu solicitud/respuesta agrega HttpLoggingInterceptor en tu retrofit.

Basado en esta respuesta tu ServiceHelper sería:

private ServiceHelper() {
        httpClient = new OkHttpClient.Builder();
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        httpClient.interceptors().add(interceptor);
        Retrofit retrofit = createAdapter().build();
        service = retrofit.create(IService.class);
    }

También no olvides agregar:

compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'

14voto

André Ramon Puntos 802

Usando Moshi:

Cuando estés construyendo tu servicio de Retrofit, agrega .asLenient() a tu MoshiConverterFactory. No necesitas un ScalarsConverter. Debería verse algo así:

return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(ENDPOINT)
                .addConverterFactory(MoshiConverterFactory.create().asLenient())
                .build()
                .create(UserService::class.java)

9voto

Jahanzaib Puntos 134

Hubo un error en la comprensión del tipo de retorno. Simplemente agrega la cabecera y se solucionará tu problema

@Headers("Content-Type: application/json")

4voto

Raj Puntos 136

Tuve el mismo problema junto con https://stackoverflow.com/a/57245058/8968137 y ambos se solucionaron después de arreglar el google-services.json

4voto

Ali Gürelli Puntos 992

También este problema ocurre cuando el tipo de contenido de la respuesta no es application/json. En mi caso, el tipo de contenido de la respuesta era text/html y me enfrenté a este problema. Lo cambié a application/json y entonces funcionó.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X