Use JsonReader.setLenient (true) para aceptar JSON con formato incorrecto en la línea 1, columna 1, ruta $

105

¿Qué es este error? ¿Cómo puedo arreglar esto? Mi aplicación se está ejecutando pero no puede cargar datos. Y este es mi error: use JsonReader.setLenient (true) para aceptar JSON con formato incorrecto en la línea 1, columna 1, ruta $

Este es mi fragmento:

public class news extends Fragment {


private RecyclerView recyclerView;
private ArrayList<Deatails> 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<Deatails>();
    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<JSONResponse> call = request.getJSON();
        final ProgressDialog progressDialog = new ProgressDialog(getActivity());
        progressDialog.show();
        call.enqueue(new Callback<JSONResponse>() {
            @Override
            public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {
                progressDialog.dismiss();
                JSONResponse jsonResponse = response.body();
                data.addAll(Arrays.asList(jsonResponse.getAndroid()));
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onFailure(Call<JSONResponse> 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<JSONResponse> getJSON();
}

una

ACTUALIZAR

siempre este error no se trata de su json, podría deberse a su solicitud incorrecta, para un mejor manejo, primero verifique su solicitud en cartero si recibió una respuesta, luego compare su respuesta json con su modelo si no hay nada malo, entonces este error proviene de su solicitud incorrecta, también podría suceder cuando su respuesta no sea josn (en algunos casos, la respuesta podría ser html)

erfan
fuente
response.body()
Muestre
@ cricket_007 edito mi pregunta y muestro mis resultados
erfan
No pedí imágenes. Le pedí que imprima el valor que tal vez devuelva el servidor.
OneCricketeer
1
¿Cómo se imprime un valor en Java? System.out.println, ¿si? En Android puedes usar la Logclase, pero eso no importa. No está obteniendo datos o se está produciendo un error en o alrededor JSONResponse jsonResponse = response.body();. No sé cómo solucionar su error porque podría estar relacionado con la red. Debería poder inspeccionar ese valor por su cuenta.
OneCricketeer
Tampoco soy un profesional, estoy tratando de enseñarte cómo depurar cualquier aplicación Java, nada realmente específico de Android
OneCricketeer

Respuestas:

187

Este es un problema bien conocido y, según esta respuesta, podría 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 agrega esto a su actualización , le 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 que puede encontrar la respuesta aquí (este error significa que la respuesta de su servidor no está bien formateada); Así que cambie la respuesta del servidor para devolver algo:

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

Para una mejor comprensión, compare su respuesta con la api de Github .

Sugerencia : para averiguar qué está pasando con su request/responsecomplemento HttpLoggingInterceptoren su actualización .

Según esta respuesta, su 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);
    }

Además, no olvide agregar:

compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
Amir
fuente
Edito el aspecto de mi pregunta. pero da el mismo error: use JsonReader.setLenient (verdadero) para aceptar JSON con formato incorrecto en la línea 1, columna 1, ruta $. también agregue la imagen de error en cuestión
erfan
@erfan ver respuesta editada; El problema se debe a que su respuesta del servidor no es correcta; eliminar "alrededor del nombre del atributo y el problema se solucionará.
Amir
1
{android: [{ver: "1.5", nombre: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} este es mi json exacto como en nuestro ejemplo y sigue siendo el mismo error: '(
erfan
{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, corrige de esta manera
erfan
3
use esto y le dirá inmediatamente por qué su json es incorrecto jsonlint.com
Saik Caskey
11

Además, este problema se produce cuando el tipo de contenido de respuesta no lo es application/json. En mi caso, el tipo de contenido de respuesta fue text/htmly me enfrenté a este problema. Lo cambié para application/jsonque funcionó.

Ali Gürelli
fuente
6

Hubo un error en la comprensión del tipo de devolución.Simplemente agregue el encabezado y resolverá su problema

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

En mi caso ; lo que resolvió mi problema fue .....

Es posible que tenga json como este, las claves sin " comillas dobles ...

{nombre: "prueba", teléfono: "2324234"}

Así que pruebe cualquier Json Validator en línea para asegurarse de tener la sintaxis correcta ...

Json Validator en línea

Shareef
fuente
1

Usando Moshi:

Cuando cree su servicio de modificación, agregue .asLenient () a su MoshiConverterFactory. No necesitas un ScalarsConverter. Debería verse algo como esto:

return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(ENDPOINT)
                .addConverterFactory(MoshiConverterFactory.create().asLenient())
                .build()
                .create(UserService::class.java)
André Ramon
fuente
0

Me enfrenté a este problema e hice una investigación y no obtuve nada, así que lo intenté y finalmente supe la causa de este problema. el problema en la API, asegúrese de tener un buen nombre de variable. Usé $ start_date y causó el problema, así que pruebo $ startdate y ¡funciona!

también asegúrese de enviar todos los parámetros que declaran en la API, por ejemplo, $ startdate = $ _POST ['startdate']; $ fecha final = $ _POST ['fecha final'];

tienes que pasar estas dos variables de la modificación.

Además, si usa la fecha en la declaración SQL, intente ponerla dentro de '' como '2017-07-24'

Espero que te ayude.

Momen Zaqout
fuente
0

Este problema comenzó a ocurrirme de repente, así que estaba seguro de que podría haber alguna otra razón. Al profundizar, fue un problema simple donde usé httpen BaseUrl de Retrofit en lugar de https. Así que cambiarlo para httpsresolver el problema para mí.

Shubhral
fuente
0

También vale la pena verificar si hay algún error en el tipo de retorno de sus métodos de interfaz. Podría reproducir este problema teniendo un tipo de retorno no deseado comoCall<Call<ResponseBody>>

Rowland Mtetezi
fuente
0

Resolví este problema muy fácilmente después de descubrir que esto sucede cuando no está generando un objeto JSON adecuado, simplemente usé el en echo json_encode($arrayName);lugar de print_r($arrayName);With my php api.

Todos los lenguajes de programación o al menos la mayoría de los lenguajes de programación deben tener su propia versión de las funciones json_encode()y json_decode().

Jevon
fuente