Satır 1 sütun 1 yol $ 'da hatalı biçimlendirilmiş JSON'u kabul etmek için JsonReader.setLenient (true) kullanın


105

Bu hata nedir? Bunu nasıl düzeltebilirim? Uygulamam çalışıyor ancak veri yükleyemiyor. Ve bu benim Hatam: Hat 1 sütun 1 yol $ 'da hatalı biçimlendirilmiş JSON'u kabul etmek için JsonReader.setLenient (true) kullanın

Bu benim parçam:

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

GÜNCELLEME

her zaman bu hata json'unuzla ilgili değil, yanlış isteğinizden kaynaklanabilir, daha iyi ele almak için önce postacıdaki isteğinizi kontrol edin, ardından json yanıtınızı modelinizle karşılaştırın, eğer hiçbir şey yanlış değilse, bu hata yanlış isteğinizden gelir, yanıtınız josn olmadığında da olabilir (bazı durumlarda yanıt html olabilir)


Eğer aldığınız o çıktıyı göstermek Lütfenresponse.body()
OneCricketeer

@ cricket_007 i düzenlemek benim sorum ve benim sonuçlar göstermektedir
erfan

Resim istemedim. Sunucudan döndürülebilecek değeri yazdırmanızı istedim.
OneCricketeer

1
Java'da bir değeri nasıl yazdırırsınız? System.out.println, Evet? Android'de Logsınıfı kullanabilirsiniz , ancak bu önemli değil. Veri almıyorsunuz veya konumunda veya çevresinde bir hata meydana geliyor JSONResponse jsonResponse = response.body();. Ağ ile ilgili olabileceği için hatanızı nasıl düzelteceğimi bilmiyorum. Bu değeri kendi başınıza inceleyebilmelisiniz.
OneCricketeer

Ben de profesyonel değilim, size herhangi bir Java uygulamasında nasıl hata ayıklayacağınızı öğretmeye çalışıyorum, gerçekten Android'e özgü bir şey yok
OneCricketeer

Yanıtlar:


187

Bu iyi bilinen bir sorundur ve aşağıdakilere dayanmaktadır: bu yanıta şunları ekleyebilirsiniz setLenient:

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

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

Şimdi, bunu eklerseniz güçlendirmenize , size başka bir hata verir:

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

Bu, burada yanıt bulabileceğiniz iyi bilinen başka bir hatadır (bu hata, sunucu yanıtınızın iyi biçimlendirilmediği anlamına gelir); Bir şey döndürmek için sunucu yanıtını değiştirin:

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

Daha iyi anlamak için yanıtınızı Github api ile karşılaştırın .

Öneri : Güçlendirmenizdekirequest/response eklentinize neler olduğunu öğrenmek HttpLoggingInterceptoriçin .

Bu yanıta dayanarak ServiceHelper'ınız şöyle olacaktır:

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

Ayrıca şunu eklemeyi unutmayın:

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

soru görünümümü düzenlerim. ancak aynı hatayı verin: Hat 1 sütun 1 yol $ 'da hatalı biçimlendirilmiş JSON'u kabul etmek için JsonReader.setLenient (true) kullanın. söz konusu hata resmini de ekle
erfan

@erfan düzenlenmiş yanıta bakın; Sunucudan yanıt çünkü konudur Değil doğru; öznitelik adının etrafını kaldırın "ve sorun düzeltilecektir.
Amir

1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} bu benim json'um tıpkı örneğiniz gibi ve hala aynı hata: '(
erfan

{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, bu şekilde düzelt
erfan

3
bunu kullanın ve size json'unuzun
Saik Caskey

11

Ayrıca bu sorun, yanıt içerik türü olmadığında ortaya çıkar application/json. Benim durumumda yanıt içerik türü idi text/htmlve bu sorunla karşılaştım. Bunun için değiştirildi application/jsonsonra işe yaradı.


6

Dönüş Türü anlaşılırken bir hata oluştu Sadece Başlık ekleyin, sorununuzu çözecektir

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


1

Benim durumumda ; sorunumu ne çözdü .....

Böyle bir json olabilirdi, anahtarlar " çift tırnaksız ...

{ad: "test", telefon: "2324234"}

Doğru söz dizimine sahip olduğunuzdan emin olmak için herhangi bir çevrimiçi Json Doğrulayıcıyı deneyin ...

Json Doğrulayıcı Çevrimiçi


1

Moshi Kullanımı:

Retrofit Hizmetinizi oluştururken MoshiConverterFactory'nize .asLenient () ekleyin. ScalarsConverter'a ihtiyacınız yok. Bunun gibi bir şeye benzemeli:

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

0

Bu sorunla karşılaştım ve araştırma yaptım ve hiçbir şey alamadım, bu yüzden deniyordum ve sonunda bu sorunun nedenini anladım. API'deki sorun, iyi bir değişken adınız olduğundan emin olun $ start_date kullandım ve bu soruna neden oldu, bu yüzden $ startdate'i deniyorum ve çalışıyor!

ayrıca, API üzerinde bildirilen tüm parametreleri gönderdiğinizden emin olun, örneğin, $ startdate = $ _POST ['startdate']; $ bitiş tarihi = $ _POST ['bitiş tarihi'];

bu iki değişkeni güçlendirmeden geçirmeniz gerekir.

ayrıca SQL deyiminde tarih kullanırsanız, '' 2017-07-24 'gibi' 'içine koymaya çalışın

Umarım size yardımcı olur.


0

Bu sorun benim için birdenbire ortaya çıkmaya başladı, bu yüzden emindim, başka bir sebep olabilirdi. Derin httpkazarken, Retrofit yerine BaseUrl'de kullandığım basit bir sorundu https. Bu yüzden httpsbenim için sorunu çözecek şekilde değiştirmek .


0

Ayrıca, arayüz yöntemlerinizin dönüş türünde herhangi bir hata olup olmadığını kontrol etmeye değer. Bu sorunu, istenmeyen bir dönüş türüne sahip olarak yeniden oluşturabilirim.Call<Call<ResponseBody>>


0

Uygun bir JSON nesnesi çıktılamadığınızda bunun gerçekleştiğini öğrendikten sonra bu sorunu çok kolay çözdüm, sadece echo json_encode($arrayName); bunun yerineprint_r($arrayName); With my php api .

Her programlama dili veya en azından çoğu programlama dili, json_encode()ve json_decode()işlevlerinin kendi sürümlerine sahip olmalıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.