Utilizza JsonReader.setLenient (true) per accettare JSON non valido alla riga 1, colonna 1, percorso $


105

Cos'è questo errore? Come posso risolvere questo problema? La mia app è in esecuzione ma non riesce a caricare i dati. E questo è il mio errore: usa JsonReader.setLenient (true) per accettare JSON non valido alla riga 1 colonna 1 percorso $

Questo è il mio frammento:

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();
}

un'

AGGIORNARE

sempre questo errore non riguarda il tuo json, potrebbe derivare dalla tua richiesta sbagliata, per una migliore gestione controlla prima la tua richiesta nel postino se hai una risposta, quindi confronta la tua risposta json con il tuo modello se non c'è niente di sbagliato, allora questo errore proviene dalla tua richiesta sbagliata, inoltre potrebbe accadere quando la tua risposta non è josn (in alcuni casi la risposta potrebbe essere html)


Mostra l'output che ricevi daresponse.body()
OneCricketeer

@ cricket_007 modifico la mia domanda e mostro i miei risultati
erfan

Non ho chiesto immagini. Ti ho chiesto di stampare il valore eventualmente restituito dal server.
OneCricketeer

1
Come si stampa un valore in Java? System.out.println, sì? In Android puoi usare la Logclasse, ma non importa. Non stai ricevendo dati o si sta verificando un errore in o intorno a JSONResponse jsonResponse = response.body();. Non so come correggere il tuo errore perché potrebbe essere correlato alla rete. Dovresti essere in grado di ispezionare quel valore da solo.
OneCricketeer

Non sono nemmeno un professionista, sto cercando di insegnarti come eseguire il debug di qualsiasi applicazione Java, niente di specifico per Android
OneCricketeer

Risposte:


187

Questo è un problema ben noto e in base a questa risposta potresti aggiungere setLenient:

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

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

Ora, se lo aggiungi al tuo retrofit , ti dà un altro errore:

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

Questo è un altro errore ben noto che puoi trovare risposta qui (questo errore significa che la risposta del tuo server non è ben formattata); Quindi cambia la risposta del server per restituire qualcosa:

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

Per una migliore comprensione, confronta la tua risposta con l' API di Github .

Suggerimento : per scoprire cosa sta succedendo alla tua request/responseaggiunta HttpLoggingInterceptornel tuo retrofit .

Sulla base di questa risposta, il tuo ServiceHelper sarebbe:

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);
    }

Inoltre, non dimenticare di aggiungere:

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

modifico l'aspetto della mia domanda. ma restituisci lo stesso errore: usa JsonReader.setLenient (true) per accettare JSON non valido alla riga 1 colonna 1 percorso $. aggiungi anche l'immagine dell'errore in questione
erfan

@erfan vedi risposta modificata; Il problema è perché la tua risposta dal server non è corretta; rimuovere "attorno al nome dell'attributo e il problema verrà risolto.
Amir

1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} questo è il mio json esattamente come il tuo esempio e sempre lo stesso errore: '(
erfan

{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, risolvi in ​​questo modo
erfan


11

Anche questo problema si verifica quando il tipo di contenuto della risposta non lo è application/json. Nel mio caso il tipo di contenuto della risposta era text/htmle ho affrontato questo problema. L'ho cambiato per application/jsonpoi ha funzionato.


6

Si è verificato un errore nella comprensione del tipo di ritorno Basta aggiungere l'intestazione e risolverà il problema

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


1

Nel mio caso ; quello che ha risolto il mio problema è stato ...

Potresti avere json come questo, le chiavi senza " virgolette doppie ....

{name: "test", phone: "2324234"}

Quindi prova qualsiasi validatore Json online per assicurarti di avere la sintassi corretta ...

Validatore Json in linea


1

Utilizzando Moshi:

Quando crei il tuo servizio di retrofit, aggiungi .asLenient () alla tua MoshiConverterFactory. Non hai bisogno di uno ScalarsConverter. Dovrebbe assomigliare a qualcosa di simile a questo:

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

0

Ho affrontato questo problema e ho fatto ricerche e non ho ottenuto nulla, quindi stavo provando e alla fine conoscevo la causa di questo problema. il problema sull'API, assicurati di avere un buon nome di variabile Ho usato $ start_date e ha causato il problema, quindi provo $ startdate e funziona!

inoltre assicurati di inviare tutti i parametri che dichiarano sull'API, ad esempio $ startdate = $ _POST ['startdate']; $ enddate = $ _POST ['enddate'];

devi passare queste due variabili dal retrofit.

anche se usi la data sull'istruzione SQL, prova a inserirla all'interno di "come" 24-07-2017

Spero ti aiuti.


0

Questo problema ha iniziato a verificarsi per me all'improvviso, quindi ero sicuro che potesse esserci qualche altro motivo. Scavando in profondità, è stato un semplice problema in cui ho usato httpBaseUrl di Retrofit invece di https. Quindi cambiarlo per httpsrisolvere il problema per me.


0

Vale anche la pena controllare se ci sono errori nel tipo di ritorno dei metodi di interfaccia. Potrei riprodurre questo problema avendo un tipo di ritorno non intenzionale comeCall<Call<ResponseBody>>


0

Ho risolto questo problema molto facilmente dopo aver scoperto che ciò accade quando non stai emettendo un oggetto JSON corretto, ho semplicemente usato il echo json_encode($arrayName);invece diprint_r($arrayName); With my php api.

Ogni linguaggio di programmazione o almeno la maggior parte dei linguaggi di programmazione dovrebbe avere la propria versione delle funzioni json_encode()e json_decode().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.