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();
}
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
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'
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.
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
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")
wenn Ihre JSON-Formate in Ordnung sind, überprüfen Sie Ihre Datenbankabfragen. Ändern Sie sie und versuchen Sie es erneut
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.
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 ...
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.