Utilisez JsonReader.setLenient (true) pour accepter un JSON mal formé à la ligne 1, colonne 1 chemin $


105

Quelle est cette erreur? Comment puis-je réparer cela? Mon application est en cours d'exécution mais ne parvient pas à charger les données. Et voici mon erreur: utilisez JsonReader.setLenient (true) pour accepter JSON malformé à la ligne 1, colonne 1 chemin $

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

une

METTRE À JOUR

toujours cette erreur ne concerne pas votre json, cela pourrait provenir de votre mauvaise demande, pour une meilleure gestion, vérifiez d'abord votre demande au facteur si vous avez une réponse, puis comparez votre réponse json avec votre modèle si rien ne va pas, cette erreur provient de votre mauvaise demande, cela peut également arriver lorsque votre réponse n'est pas josn (dans certains cas, la réponse peut être html)


Veuillez montrer la sortie que vous recevez deresponse.body()
OneCricketeer

@ cricket_007 je modifie ma question et affiche mes résultats
erfan

Je n'ai pas demandé d'images. Je vous ai demandé d'imprimer la valeur qui est peut-être retournée par le serveur.
OneCricketeer

1
Comment imprimer une valeur en Java? System.out.println, Oui? Dans Android, vous pouvez utiliser la Logclasse, mais cela n'a pas d'importance. Vous n'obtenez pas de données ou une erreur se produit à ou autour JSONResponse jsonResponse = response.body();. Je ne sais pas comment corriger votre erreur car cela pourrait être lié au réseau. Vous devriez être en mesure d'inspecter cette valeur par vous-même.
OneCricketeer

Je ne suis pas un pro non plus, j'essaie de vous apprendre à déboguer n'importe quelle application Java, rien de vraiment spécifique à Android
OneCricketeer

Réponses:


187

Il s'agit d'un problème bien connu et sur la base de cette réponse, vous pouvez ajouter setLenient:

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

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

Maintenant, si vous ajoutez ceci à votre rénovation , cela vous donne une autre erreur:

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

C'est une autre erreur bien connue à laquelle vous pouvez trouver une réponse ici (cette erreur signifie que la réponse de votre serveur n'est pas bien formatée); Alors changez la réponse du serveur pour renvoyer quelque chose:

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

Pour une meilleure compréhension, comparez votre réponse avec l' API Github .

Suggestion : pour savoir ce qui se passe avec votre request/responseajout HttpLoggingInterceptordans votre rénovation .

Sur la base de cette réponse, votre ServiceHelper serait:

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

N'oubliez pas non plus d'ajouter:

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

je modifie mon look de question. mais donnez la même erreur: utilisez JsonReader.setLenient (true) pour accepter un JSON mal formé à la ligne 1, colonne 1, chemin $. ajouter également une photo d'erreur en question
erfan

@erfan voir la réponse modifiée; Le problème est que votre réponse du serveur n'est pas correcte; remove "autour du nom de l'attribut et le problème sera résolu.
Amir

1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} c'est mon json exactement comme votre exemple et toujours la même erreur: '(
erfan

{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]},
corrigez de

3
utilisez ceci et il vous dira immédiatement pourquoi votre json est faux jsonlint.com
Saik Caskey

11

Ce problème se produit également lorsque le type de contenu de la réponse ne l'est pas application/json. Dans mon cas, le type de contenu de réponse était text/htmlet j'ai rencontré ce problème. Je l'ai changé pour que application/jsoncela fonctionne.


6

Il y a eu une erreur dans la compréhension du type de retour Ajoutez simplement l'en-tête et cela résoudra votre problème

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


1

Dans mon cas ; ce qui a résolu mon problème était .....

Vous pouvez avoir json comme ça, les touches sans " guillemets doubles ....

{nom: "test", téléphone: "2324234"}

Alors essayez n'importe quel validateur Json en ligne pour vous assurer que vous avez la bonne syntaxe ...

Validateur Json en ligne


1

Utilisation de Moshi:

Lors de la création de votre service de rénovation, ajoutez .asLenient () à votre MoshiConverterFactory. Vous n'avez pas besoin d'un ScalarsConverter. Ça devrait ressembler a quelque chose comme ca:

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

0

J'ai fait face à ce problème et j'ai fait des recherches et je n'ai rien obtenu, alors j'essayais et finalement, je connaissais la cause de ce problème. le problème sur l'API, assurez-vous que vous avez un bon nom de variable J'ai utilisé $ start_date et cela a causé le problème, alors j'essaye $ startdate et ça marche!

assurez-vous également d'envoyer tous les paramètres déclarés sur l'API, par exemple $ startdate = $ _POST ['startdate']; $ enddate = $ _POST ['enddate'];

vous devez transmettre ces deux variables de la modernisation.

ainsi si vous utilisez la date sur l'instruction SQL, essayez de la mettre à l'intérieur de '' comme '2017-07-24'

J'espère que ça t'aide.


0

Ce problème a commencé à se produire pour moi tout d'un coup, donc j'étais sûr qu'il pourrait y avoir une autre raison. En creusant profondément, c'était un problème simple où j'ai utilisé httpdans BaseUrl de Retrofit au lieu de https. Donc, le changer pour httpsrésoudre le problème pour moi.


0

Il vaut également la peine de vérifier s'il y a des erreurs dans le type de retour de vos méthodes d'interface. Je pourrais reproduire ce problème en ayant un type de retour non intentionnel commeCall<Call<ResponseBody>>


0

J'ai résolu ce problème très facilement après avoir découvert que cela se produisait lorsque vous ne produisiez pas un objet JSON approprié, j'ai simplement utilisé le à la echo json_encode($arrayName);place de print_r($arrayName);Avec mon api php.

Chaque langage de programmation ou au moins la plupart des langages de programmation doivent avoir leur propre version des fonctions json_encode()et json_decode().

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.