Verwenden Sie JsonReader.setLenient (true), um fehlerhaften JSON in Zeile 1, Spalte 1, Pfad $ zu akzeptieren

105

Was ist dieser Fehler? Wie kann ich das beheben? Meine App wird ausgeführt, kann jedoch keine Daten laden. Und das ist mein Fehler: Verwenden Sie JsonReader.setLenient (true), um fehlerhaften JSON in Zeile 1, Spalte 1, Pfad $ zu akzeptieren

Das ist mein Fragment:

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

ein

AKTUALISIEREN

Immer dieser Fehler nicht über Ihren JSON, es könnte von Ihrer falschen Anfrage werden, zur besseren Behandlung überprüfen Sie zuerst Ihre Anfrage im Postboten, wenn Sie eine Antwort erhalten haben, und vergleichen Sie Ihre JSON-Antwort mit Ihrem Modell, wenn nichts falsch ist, dann kommt dieser Fehler von Ihrer falschen Anfrage. es könnte auch passieren, wenn Ihre Antwort nicht josn ist (in einigen Fällen könnte die Antwort HTML sein)

erfan
quelle
Bitte zeigen Sie die Ausgabe, die Sie vonresponse.body()
OneCricketeer
@ Cricket_007 Ich bearbeite meine Frage und zeige meine Ergebnisse
erfan
Ich habe nicht nach Bildern gefragt. Ich habe Sie gebeten, den Wert auszudrucken, der möglicherweise vom Server zurückgegeben wird.
OneCricketeer
1
Wie druckt man einen Wert in Java? System.out.println, Ja? In Android können Sie die LogKlasse verwenden, aber das spielt keine Rolle. Sie erhalten keine Daten oder es tritt ein Fehler bei oder in der Nähe auf JSONResponse jsonResponse = response.body();. Ich weiß nicht, wie ich Ihren Fehler beheben soll, da er möglicherweise mit dem Netzwerk zusammenhängt. Sie sollten in der Lage sein, diesen Wert selbst zu überprüfen.
OneCricketeer
Ich bin auch kein Profi, ich versuche Ihnen beizubringen, wie man eine Java-Anwendung
debuggt

Antworten:

186

Dies ist ein bekanntes Problem. Basierend auf dieser Antwort können Sie Folgendes hinzufügen setLenient:

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

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

Wenn Sie dies nun zu Ihrer Nachrüstung hinzufügen , erhalten Sie einen weiteren Fehler:

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

Dies ist ein weiterer bekannter Fehler Sie Antwort finden hier (Dieser Fehler bedeutet , dass der Server - Antwort gut formatiert ist nicht); Ändern Sie also die Serverantwort, um etwas zurückzugeben:

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

Vergleichen Sie zum besseren Verständnis Ihre Antwort mit der Github-API .

Vorschlag : um herauszufinden , was zu Ihrem ist los request/responseadd HttpLoggingInterceptorin Ihrem Retrofit .

Basierend auf dieser Antwort wäre Ihr ServiceHelper :

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

Vergessen Sie auch nicht hinzuzufügen:

compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
Amir
quelle
Ich bearbeite meinen Fragenblick. Geben Sie jedoch denselben Fehler an: Verwenden Sie JsonReader.setLenient (true), um fehlerhaften JSON in Zeile 1, Spalte 1, Pfad $, zu akzeptieren. auch
Fehlerbild
@erfan siehe bearbeitete Antwort; Das Problem ist, dass Ihre Antwort vom Server nicht korrekt ist. entfernen "um Attributname und Problem wird behoben.
Amir
1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} Dies ist mein json genau wie dein Beispiel und immer noch der gleiche Fehler: '(
erfan
{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, auf diese Weise
korrigieren
3
Verwenden Sie dies und es wird Ihnen sofort sagen, warum Ihr json falsch ist jsonlint.com
Saik Caskey
11

Dieses Problem tritt auch auf, wenn der Inhaltstyp der Antwort nicht lautet application/json. In meinem Fall war der Inhaltstyp der Antwort text/htmlund ich war mit diesem Problem konfrontiert. Ich habe es geändert, application/jsondann hat es funktioniert.

Ali Gürelli
quelle
6

Beim Verständnis des Rückgabetyps ist ein Fehler aufgetreten. Fügen Sie einfach den Header hinzu, und das Problem wird behoben

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

In meinem Fall ; Was mein Problem gelöst hat war .....

Sie könnten json so haben, die Schlüssel ohne " doppelte Anführungszeichen ....

{Name: "Test", Telefon: "2324234"}

Probieren Sie also einen beliebigen Online-Json-Validator aus, um sicherzustellen, dass Sie die richtige Syntax haben ...

Json Validator Online

shareef
quelle
1

Verwenden von Moshi:

Fügen Sie beim Erstellen Ihres Nachrüstdienstes .asLenient () zu Ihrer MoshiConverterFactory hinzu. Sie benötigen keinen ScalarsConverter. Es sollte ungefähr so ​​aussehen:

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

Ich habe mich diesem Problem gestellt und Nachforschungen angestellt und nichts bekommen, also habe ich es versucht und schließlich wusste ich die Ursache für dieses Problem. Stellen Sie sicher, dass Sie einen guten Variablennamen haben, den ich mit $ start_date verwendet habe und der das Problem verursacht hat. Also versuche ich $ startdate und es funktioniert!

Stellen Sie außerdem sicher, dass Sie alle Parameter senden, die in der API deklariert sind, z. B. $ startdate = $ _POST ['startdate']; $ enddate = $ _POST ['enddate'];

Sie müssen diese beiden Variablen aus der Nachrüstung übergeben.

Wenn Sie das Datum für die SQL-Anweisung verwenden, versuchen Sie, es in '' wie '2017-07-24' einzufügen.

Ich hoffe es hilft dir.

Momen Zaqout
quelle
0

Dieses Problem trat plötzlich bei mir auf, daher war ich mir sicher, dass es einen anderen Grund geben könnte. Beim tiefen Graben war es ein einfaches Problem, bei dem ich httpstattdessen in der BaseUrl von Retrofit verwendet habe https. Also habe httpsich es geändert, um das Problem für mich zu lösen.

Shubhral
quelle
0

Es lohnt sich auch zu überprüfen, ob der Rückgabetyp Ihrer Schnittstellenmethoden fehlerhaft ist. Ich könnte dieses Problem reproduzieren, indem ich einen unbeabsichtigten Rückgabetyp wie habeCall<Call<ResponseBody>>

Rowland Mtetezi
quelle
0

Ich habe dieses Problem sehr einfach gelöst, nachdem ich herausgefunden habe, dass dies passiert, wenn Sie kein richtiges JSON-Objekt ausgeben. Ich habe einfach das echo json_encode($arrayName);anstelle von print_r($arrayName);Mit meiner PHP-API verwendet.

Jede Programmiersprache oder zumindest die meisten Programmiersprachen sollten eine eigene Version der Funktionen json_encode()und haben json_decode().

Jevon
quelle