Gunakan JsonReader.setLenient (true) untuk menerima format JSON yang salah pada baris 1 kolom 1 jalur $

105

Apa kesalahan ini? Bagaimana cara memperbaikinya? Aplikasi saya berjalan tetapi tidak dapat memuat data. Dan ini adalah Kesalahan saya: Gunakan JsonReader.setLenient (true) untuk menerima format JSON yang salah pada baris 1 kolom 1 jalur $

Ini fragmen saya:

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

Sebuah

MEMPERBARUI

selalu kesalahan ini bukan tentang json Anda, itu bisa jadi dari permintaan Anda yang salah, untuk lebih baik menangani terlebih dahulu periksa permintaan Anda di tukang pos jika Anda mendapat respons kemudian bandingkan respons json Anda dengan model Anda jika tidak ada yang salah maka kesalahan ini berasal dari permintaan Anda yang salah, juga bisa terjadi jika tanggapan Anda tidak josn (dalam beberapa kasus, tanggapan dapat berupa html)

erfan
sumber
Tolong tunjukkan keluaran yang Anda terima dariresponse.body()
OneCricketeer
@ cricket_007 saya mengedit pertanyaan saya dan menunjukkan hasil saya
erfan
Saya tidak meminta gambar. Saya meminta Anda untuk mencetak nilai yang mungkin dikembalikan dari server.
OneCricketeer
1
Bagaimana Anda mencetak nilai di Java? System.out.println, Iya? Di Android Anda dapat menggunakan Logkelas, tetapi itu tidak masalah. Anda tidak mendapatkan data atau kesalahan terjadi pada atau sekitar JSONResponse jsonResponse = response.body();. Saya tidak tahu bagaimana memperbaiki kesalahan Anda karena itu mungkin terkait jaringan. Anda harus bisa memeriksa nilai itu sendiri.
OneCricketeer
Saya juga bukan ahli, saya mencoba mengajari Anda cara men-debug aplikasi Java apa pun, tidak ada yang benar-benar khusus Android
OneCricketeer

Jawaban:

187

Ini adalah masalah umum dan berdasarkan jawaban ini Anda dapat menambahkan setLenient:

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

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

Sekarang, jika Anda menambahkan ini ke retrofit Anda , ini memberi Anda kesalahan lain:

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

Ini adalah kesalahan terkenal lainnya yang dapat Anda temukan jawabannya di sini (kesalahan ini berarti respons server Anda tidak diformat dengan baik); Jadi ubah respons server untuk mengembalikan sesuatu:

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

Untuk pemahaman yang lebih baik, bandingkan respons Anda dengan Github api .

Saran : untuk mencari tahu apa yang terjadi dengan Anda request/responseadd HttpLoggingInterceptordi Anda retrofit .

Berdasarkan jawaban ini ServiceHelper Anda akan menjadi:

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

Juga jangan lupa untuk menambahkan:

compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
Amir
sumber
saya mengedit tampilan pertanyaan saya. tetapi berikan kesalahan yang sama: Gunakan JsonReader.setLenient (true) untuk menerima format JSON yang salah pada baris 1 kolom 1 jalur $. juga tambahkan gambar kesalahan yang dimaksud
erfan
@erfan melihat jawaban yang diedit; Masalahnya karena tanggapan Anda dari server tidak benar; hapus "sekitar nama atribut dan masalah akan diperbaiki.
Amir
1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} ini adalah json saya persis seperti contoh ur dan masih kesalahan yang sama: '(
erfan
{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, perbaiki dengan cara ini
erfan
3
gunakan ini dan ini akan memberitahu Anda segera mengapa json Anda salah jsonlint.com
Saik Caskey
11

Juga masalah ini terjadi ketika respon contenttype tidak application/json. Dalam kasus saya, jenis konten respons adalah text/htmldan saya menghadapi masalah ini. Saya mengubahnya menjadi application/jsonkemudian berhasil.

Ali Gürelli
sumber
6

Ada kesalahan dalam memahami return Type Just add Header dan itu akan menyelesaikan masalah Anda

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

Dalam kasus saya ; apa yang memecahkan masalah saya adalah .....

Anda mungkin memiliki json seperti ini, kuncinya tanpa " kutipan ganda ....

{nama: "test", telepon: "2324234"}

Jadi, coba Validator Json online mana pun untuk memastikan Anda memiliki sintaks yang benar ...

Json Validator Online

shareef
sumber
1

Menggunakan Moshi:

Saat membuat Retrofit Service, tambahkan .asLenient () ke MoshiConverterFactory. Anda tidak membutuhkan ScalarsConverter. Seharusnya terlihat seperti ini:

return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(ENDPOINT)
                .addConverterFactory(MoshiConverterFactory.create().asLenient())
                .build()
                .create(UserService::class.java)
André Ramon
sumber
0

Saya telah menghadapi masalah ini dan saya melakukan penelitian dan tidak mendapatkan apa-apa, jadi saya mencoba dan akhirnya, saya tahu penyebab masalah ini. masalah di API, pastikan Anda memiliki nama variabel yang bagus Saya menggunakan $ start_date dan itu menyebabkan masalah, jadi saya mencoba $ startdate dan berhasil!

juga pastikan Anda mengirimkan semua parameter yang dideklarasikan di API, misalnya, $ startdate = $ _POST ['startdate']; $ tanggal akhir = $ _POST ['tanggal akhir'];

Anda harus melewatkan dua variabel ini dari retrofit.

juga jika Anda menggunakan tanggal pada pernyataan SQL, coba masukkan ke dalam '' seperti '2017-07-24'

Saya harap ini membantu Anda.

Momen Zaqout
sumber
0

Masalah ini mulai terjadi pada saya secara tiba-tiba, jadi saya yakin, mungkin ada alasan lain. Saat menggali lebih dalam, itu adalah masalah sederhana di mana saya menggunakan httpBaseUrl of Retrofit, bukan https. Jadi mengubahnya untuk httpsmemecahkan masalah bagi saya.

Shubhral
sumber
0

Yang juga patut diperiksa adalah apakah ada kesalahan dalam jenis kembalian metode antarmuka Anda. Saya dapat mereproduksi masalah ini dengan memiliki tipe pengembalian yang tidak diinginkan sepertiCall<Call<ResponseBody>>

Rowland Mtetezi
sumber
0

Saya memecahkan masalah ini dengan sangat mudah setelah mengetahui ini terjadi ketika Anda tidak mengeluarkan objek JSON yang tepat, saya hanya menggunakan echo json_encode($arrayName);alih - alih print_r($arrayName);With api php saya.

Setiap bahasa pemrograman atau setidaknya sebagian besar bahasa pemrograman harus memiliki versi json_encode()dan json_decode()fungsinya masing-masing.

Jevon
sumber