web-dev-qa-db-ja.com

JsonReader.setLenient(true)を使用して、1行1列1パスで不正な形式のJSONを受ける

このエラーは何ですか?どうすればこれを修正できますか?私のアプリは起動していますが、データを読み込めません。そしてこれは私のエラーです:1行1列1パスで不正な形式のJSONを受け入れるためにJsonReader.setLenient(true)を使用

これは私の断片です:

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

更新

常にこのエラーはあなたのjsonに関するものではない、それはあなたの間違った要求から来る可能性があります。また、あなたの応答がjosnではない場合にも起こる可能性があります(場合によっては応答がhtmlになっているかもしれません)。

65
erfan

これはよく知られた問題であり、 この の回答に基づいてsetLenientを追加できます。

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

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

さて、あなたがこれをあなたのretrofitに追加するなら、それはあなたに別のエラーを与えます:

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

これはあなたがここで答えを見つけることができるもう一つのよく知られたエラーです(このエラーはあなたのサーバーのレスポンスが整形式ではないことを意味します)そのため、何かを返すようにサーバーの応答を変更します。

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

理解を深めるために、回答を Github api と比較してください。

提案:あなたのrequest/responseに何が起こっているのかを調べるためには、レトロフィットHttpLoggingInterceptorを追加してください。

に基づいて、この あなたの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);
    }

また追加することを忘れないでください:

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

レスポンスcontenttypeがapplication/jsonではない場合にもこの問題が発生します。私の場合、response contenttypeはtext/htmlで、私はこの問題に直面しました。私はそれをapplication/jsonに変更し、それはうまくいった。

8
Ali Gürelli

戻り値の型の理解に誤りがありました。ヘッダーを追加するだけで問題が解決します

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

あなたのJSONフォーマットが問題なければ、データベースクエリをチェックしてください。それらを変更して再試行してください

0
Shabbir Ahmed

この問題は私にとって突然起こり始めたので、他にも理由があるのではないかと確信しました。深く掘り下げると、RetrofitのBaseUrlでhttpの代わりにhttpsを使用したのは簡単な問題でした。それでそれをhttpsに変更することは私にとって問題を解決しました。

0
Shubhral

私の場合 ;私の問題を解決したのは.....

あなたはこのようなJSONを持っているかもしれません、 "二重引用符のないキー....

{名前: "テスト"、電話番号: "2324234"}

だから、あなたが正しい構文を持っていることを確認するために任意のオンラインJson Validatorを試してみてください...

Json Validator Online

0
shareef

私はこの問題に直面しました、そして、私は研究をしました、そして、何も得ませんでしたので、私はしようとしていました、そして最後に、私はこの問題の原因を知りました。 API上の問題は、私が$ start_dateを使用してそれが問題を引き起こした良い変数名を持っていることを確認してください、それで私は$ startdateを試して、それはうまくいきます!

また、APIで宣言されているすべてのパラメータを必ず送信してください。たとえば、$ startdate = $ _POST ['startdate'];のようにします。 $ enddate = $ _POST ['enddate'];

後付けからこの2つの変数を渡す必要があります。

sQL文にdateを使用する場合も同様に、 '2017-07-24'のように ''の内側に配置するようにしてください。

お役に立てば幸いです。

0
Momen Zaqout