[解決済み] JsonReader.setLenient(true) を使用して、1 行目列 1 パスで不正な JSON を受け入れる $.
2022-01-31 15:34:31
質問
このエラーは何ですか?どうすれば直せますか?アプリは動作していますが、データを読み込むことができません。そして、これは私のエラーです。行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();
}
UPDATE (以下の文章を読んで、あなたの問題を発見してください)
- このエラーは、JSONの問題ではありません。 より良い処理のために、まずpostmanでリクエストをチェックします。 レスポンスを得た場合、jsonレスポンスとモデルを比較します。 何も問題がない場合、このエラーはあなたの間違ったリクエストから来るものです。 また、レスポンスがJosnでない場合にも起こりえます(場合によっては レスポンスはhtmlである可能性があります)
解決するには?
これはよく知られた問題で、以下のような根拠があります。
これ
を追加することができます。
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 $
これもよくあるエラーで、答えを見つけることができます。 ここで (このエラーは、サーバーの応答が適切にフォーマットされていないことを意味します); そこで、サーバーの応答を変更して、何かを返すようにします。
{
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'
関連
-
[解決済み】メソッド 'findViewById(int)' を解決できない。)
-
[解決済み】react-native: コマンドが見つかりません。
-
[解決済み】apkインストール時のINSTALL_FAILED_NO_MATCHING_ABIS
-
[解決済み] [Solved] Unsupported method: ベースコンフィグ.getApplicationIdSuffix()
-
[解決済み】フラグメントMyFragmentがアクティビティにアタッチされない。
-
[解決済み】Android Studioで最新バージョンのgradleを使用する方法
-
[解決済み】Couldn't load memtrack module Logcat Error
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] sendUserActionEvent() は null です。
-
[解決済み] 複数のデバイスを接続しているときにADB Shellを使用するには?error: more than one device and emulator "で失敗します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 現在のテーマでスタイル 'coordinatorLayoutStyle' を見つけることができませんでした。
-
[解決済み] [Solved] Error "File google-services.json is missing from module root folder. これがないとGoogle Services Pluginは機能しません" [重複]。
-
[解決済み】このアクティビティは、すでにウィンドウ装飾によって提供されるアクションバーを持っています。
-
[解決済み】"ビットマップが大きすぎてテクスチャにアップロードできない"
-
[解決済み】Build Tools リビジョン 23.0.1 の検索に失敗しました。
-
[解決済み】googleコンソールエラー`OR-IEH-01`について
-
[解決済み] 起動アクティビティを特定できませんでした。デフォルトのアクティビティが見つかりませんでした
-
[解決済み] 複数のデバイスを接続しているときにADB Shellを使用するには?error: more than one device and emulator "で失敗します。
-
[解決済み] Androidでイメージビューの背景を透明に設定する
-
[解決済み] "BEGIN_OBJECTを期待したが、1行目1列目でSTRINGだった"