it-swarm.com.de

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

Was ist dieser Fehler? Wie kann ich das beheben? Meine App läuft, kann aber keine Daten laden. Und das ist mein Fehler: Verwenden Sie JsonReader.setLenient (true), um fehlerhaftes 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(), "دستگاه شما به اینترنت متصل نیست!", 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();
}

 a

AKTUALISIEREN

immer diese fehler nicht über ihre json, es könnte aus ihrem falsch werden request, für ein besseres Handling prüfen Sie zuerst Ihre Anfrage beim Postboten. Wenn Sie eine Antwort erhalten haben, vergleichen Sie Ihre Json-Antwort mit Ihrem Modell 

56
erfan

Dies ist ein bekanntes Problem und basierend auf this Antwort könnten Sie setLenient hinzufügen:

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 Ihrem retrofit hinzufügen, wird ein weiterer Fehler angezeigt:

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, den Sie in der Antwort hier finden können (dieser Fehler bedeutet, dass Ihre Serverantwort nicht richtig formatiert ist). Ändern Sie daher 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 Github api .

Suggestion: Um herauszufinden, was mit Ihrem request/response passiert, fügen Sie HttpLoggingInterceptor in Ihrem retrofit hinzu.

Basierend auf this 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);
    }

Vergiss auch nicht hinzuzufügen:

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

Dieses Problem tritt auch auf, wenn der Antwortinhaltstyp nicht application/json ist. In meinem Fall war contenttype text/html und ich war mit diesem Problem konfrontiert. Ich änderte es in application/json, dann funktionierte es.

7
Ali Gürelli

Ich hatte das gleiche Problem zusammen mit https://stackoverflow.com/a/57245058/8968137 und beide wurden nach der Korrektur der Datei google-services.json behoben

2
Raj

Es gab einen Fehler beim Verständnis des Rückgabetyps Fügen Sie einfach Header hinzu, um das Problem zu lösen

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

wenn Ihre JSON-Formate in Ordnung sind, überprüfen Sie Ihre Datenbankabfragen. Ändern Sie sie und versuchen Sie es erneut

0
Shabbir Ahmed

Dieses Problem trat plötzlich auf, und ich war mir sicher, es könnte einen anderen Grund geben. Beim Graben war es ein einfaches Problem, bei dem ich http in der BaseUrl von Retrofit anstelle von https verwendete. Das Ändern in https hat das Problem für mich gelöst.

0
Shubhral

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

Sie könnten json so haben, die Schlüssel ohne "double -Zitate ....

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

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

Json Validator Online

0
shareef

Ich bin mit diesem Problem konfrontiert und habe Nachforschungen angestellt und nichts erhalten, also habe ich es versucht, und schließlich wusste ich die Ursache dieses Problems ... das Problem auf der API, stellen Sie sicher, dass Sie einen guten Variablennamen haben. Ich habe $ start_date verwendet und es hat das Problem verursacht, also versuche ich $ startdate und es funktioniert!

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

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

wenn Sie date in einer SQL-Anweisung verwenden, versuchen Sie, es in '' wie '2017-07-24' einzufügen.

Ich hoffe es hilft dir.

0
Momen Zaqout