175 votes

Utilisez JsonReader.setLenient(true) pour accepter le JSON malformé à la ligne 1 colonne 1 chemin $.

Quelle est cette erreur ? Comment puis-je la corriger ? Mon application fonctionne mais ne peut pas charger les données. Et voici mon erreur : Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $.

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

a

MISE À JOUR (lisez le texte ci-dessous et trouvez votre problème)

  • toujours cette erreur ne concerne pas votre json, elle pourrait provenir de votre pour mieux gérer, vérifiez d'abord votre demande dans postman. si vous avez obtenu une réponse, comparez votre réponse json avec votre modèle. Si tout va bien, cette erreur provient d'une mauvaise demande, aussi il pourrait se produire quand votre réponse pas josn (dans certains cas réponse peut être html)

0 votes

Veuillez montrer la sortie que vous recevez de response.body()

0 votes

@cricket_007 je modifie ma question et montre mes résultats

0 votes

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

287voto

Amir Hadifar Points 5294

Il s'agit d'un problème bien connu et basé sur ce vous pourriez ajouter la réponse suivante 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étrofit il vous donne une autre erreur :

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

Il s'agit d'une autre erreur bien connue à laquelle vous pouvez répondre ici (cette erreur signifie que la réponse de votre serveur n'est pas bien formatée) ; modifiez donc la réponse du serveur pour qu'elle renvoie quelque chose :

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

Pour une meilleure compréhension, comparez votre réponse avec Api Github .

Suggestion : pour savoir ce qu'il se passe à votre request/response ajouter HttpLoggingInterceptor dans votre rétrofit .

Sur la base de ce répondre à 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'

0 votes

J'ai modifié mon look question . mais donner la même erreur : Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ . also add error pic in question

0 votes

@erfan voir la réponse éditée ; Le problème est que votre réponse du serveur est Non correct ; supprimez " autour du nom de l'attribut et le problème sera résolu.

1 votes

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

16voto

Ali Gürelli Points 1012

Ce problème se produit également lorsque le type de contenu de la réponse n'est pas le suivant application/json . Dans mon cas, le type de contenu de la réponse était text/html et j'ai rencontré ce problème. Je l'ai changé en application/json puis ça a marché.

1voto

Momen Zaqout Points 422

J'ai été confronté à ce problème et j'ai fait des recherches et n'ai rien obtenu, alors j'ai essayé et finalement, j'ai connu 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, donc j'ai essayé $startdate et cela fonctionne !

Vérifiez également que vous envoyez tous les paramètres déclarés dans l'API, par exemple, $startdate = $_POST['startdate'] ; $enddate = $_POST['enddate'] ;

vous devez passer ces deux variables à partir du rétrofit.

de même, si vous utilisez une date dans une instruction SQL, essayez de la mettre à l'intérieur de ''. comme '2017-07-24'.

J'espère que cela vous aidera.

0voto

Shabbir Ahmed Points 37

Si vos formats JSON sont corrects, vérifiez vos requêtes de base de données. Essayez de les modifier et réessayez

0voto

Shubhral Points 73

Ce problème a commencé à se produire pour moi tout d'un coup, alors j'étais sûr qu'il pouvait y avoir une autre raison. En creusant un peu, il s'agissait d'un simple problème où j'ai utilisé http dans le BaseUrl de Retrofit au lieu de https . Donc, en le changeant en https a résolu le problème pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X