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


105

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

これは私の断片です:

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になることがあります)


受信した出力を表示してくださいresponse.body()
OneCricketeer

@ cricket_007質問を編集して結果を表示
erfan

画像は要求しませんでした。サーバーから返される可能性のある値を出力するように頼みました。
OneCricketeer

1
Javaで値をどのように出力しますか?System.out.println、 はい?AndroidではLogクラスを使用できますが、それは問題ではありません。データを取得していないか、または周辺でエラーが発生していJSONResponse jsonResponse = response.body();ます。ネットワークに関連している可能性があるため、エラーを修正する方法がわかりません。あなたは自分でその値を調べることができるはずです。
OneCricketeer

私もプロではありません。Javaアプリケーションのデバッグ方法を教えようとしています。実際にはAndroid固有のものはありません
OneCricketeer

回答:


187

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

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

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

これをレトロフィットに追加すると、別のエラーが発生します。

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

これは、ここで回答を見つけることができるもう1つのよく知られているエラーです(このエラーは、サーバーの応答が適切にフォーマットされていないことを意味します)。したがって、何かを返すようにサーバーの応答を変更します。

{
    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'

質問の外観を編集します。ただし、同じエラーが発生する:JsonReader.setLenient(true)を使用して、1行1列1パス$で不正な形式のJSONを受け入れます。また、問題のエラー画像を追加
erfan 2016年

@erfan編集された回答を参照してください。問題は、サーバーからの応答が正しくないためです。属性名と問題の周りの削除は、「固定されます。
アミール

1
{android:[{ver: "1.5"、name: "Cupcace"、api: "Api Level 3"、pic: "pic2.jpg"}]}これは、jsonの例とまったく同じですが、同じエラー: '(
erfan 2016年

{"android":[{"ver": "1.5"、 "name": "Cupcace"、 "api": "level3"、 "pic": "bane.jpg"}]}、この方法で修正
erfan

3
これを使用すると、jsonが間違っている理由がすぐにわかり
Caskey

11

この問題は、応答のコンテンツタイプがでない場合にも発生しapplication/jsonます。私の場合、応答のcontenttypeはtext/htmlこの問題に直面していました。私はそれを変更しapplication/jsonました。


6

戻り値のタイプの理解にエラーがありましたヘッダーを追加するだけで問題が解決します

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


1

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

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

{名前:「テスト」、電話:「2324234」}

オンラインのJson Validatorを試して、正しい構文であることを確認してください...

Json Validator Online


1

Moshiの使用:

レトロフィットサービスを構築するときに、.asLenient()をMoshiConverterFactoryに追加します。ScalarsConverterは必要ありません。次のようになります。

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

0

私はこの問題に直面し、調査を行っても何も得られなかったので、試してみて、ようやくこの問題の原因がわかりました。APIの問題、$ start_dateを使用した適切な変数名があることを確認してください。これが問題の原因になったので、$ startdateを試してみます。

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

改造からこの2つの変数を渡す必要があります。

また、SQLステートメントで日付を使用する場合は、 '2017-07-24'のように ''の中に入れてみてください

お役に立てば幸いです。


0

この問題は突然私に起こり始めたので、他の原因が考えられます。深く掘り下げると、のhttp代わりにRetrofitのBaseUrlで使用したのは単純な問題でしたhttps。だからhttps私のために問題を解決するためにそれを変更しました。


0

また、インターフェースメソッドの戻り値の型にエラーがないかどうかを確認することも重要です。私は次のような意図しない戻り値の型を持つことでこの問題を再現できましたCall<Call<ResponseBody>>


0

私は、私は単純に使用しますが、適切なJSONオブジェクトを出力していないとき、この問題が発生して発見した後は非常に簡単にこの問題を解決するecho json_encode($arrayName);代わりに、print_r($arrayName);私のPHPのAPIを使用しました。

すべてのプログラミング言語、または少なくともほとんどのプログラミング言語には、json_encode()およびjson_decode()関数の独自のバージョンが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.