Використовуйте JsonReader.setLenient (true), щоб прийняти неправильно сформований JSON у рядку 1 стовпця 1 шлях $


105

Що це за помилка? Як я можу це виправити? Мій додаток працює, але не може завантажити дані. І це моя помилка. Використовуйте JsonReader.setLenient (true), щоб прийняти неправильно сформований JSON у рядку 1 стовпця 1 шлях $

Це мій фрагмент:

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

ЗапитІнтерфейсу:

public interface RequestInterface {

@GET("Erfan/news.php")
Call<JSONResponse> getJSON();
}

а

ОНОВЛЕННЯ

завжди ця помилка не стосується вашого json, вона може статися з вашого помилкового запиту, для кращого звернення спочатку перевірте свій запит у листоноші, якщо ви отримали відповідь, а потім порівняйте відповідь 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 $

Це ще одна відома помилка, на яку можна знайти відповідь тут (ця помилка означає, що відповідь вашого сервера неправильно відформатована); Тож змініть відповідь сервера, щоб щось повернути:

{
    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), щоб прийняти неправильно сформований JSON у рядку 1 стовпця 1 шлях $. також додайте знімок про помилку
erfan

@erfan див. відредаговану відповідь; Проблема в тому , що ваша відповідь від сервера НЕ правильно; видалити "навколо імені атрибута і проблема буде виправлена.
Амір

1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} це мій json точно такий, як приклад ur та все ще така ж помилка: '(
ерфан

{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, виправити таким чином
erfan

3
скористайтеся цим, і він негайно підкаже, чому ваш json неправий jsonlint.com
Saik Caskey

11

Також ця проблема виникає, коли тип вмісту відповіді відсутній application/json. У моєму випадку контент-тип відповіді був text/htmlі я зіткнувся з цією проблемою. Я змінив його, щоб application/jsonтоді він працював.


6

Виникла помилка в розумінні повернення Type Просто додайте заголовка, і це вирішить вашу проблему

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


1

У моєму випадку; що вирішило моє питання .....

Можливо, у вас був такий json, як ключі без " подвійних цитат ....

{ім'я: "тест", телефон: "2324234"}

Тому спробуйте будь-який онлайн-валідатор Json, щоб переконатися, що у вас правильний синтаксис ...

Json Validator Online


1

Використання Моші:

Під час створення послуги з модернізації додайте .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'];

ви повинні передати цю дві змінні з модернізації.

а також якщо ви використовуєте дату для оператора SQL, спробуйте ввести її всередині '' типу '2017-07-24'

Я сподіваюся, що це вам допоможе.


0

Це питання почало виникати для мене раптом, тому я був впевнений, що може бути якась інша причина. Коли копати глибоко, це було простою проблемою, де я використовував httpBaseUrl Retrofit замість https. Тож змінивши це, щоб httpsвирішити питання для мене.


0

Також варто перевірити, чи є якісь помилки у типі повернення методів вашого інтерфейсу. Я міг би відтворити цю проблему, маючи такий тип ненавмисного поверненняCall<Call<ResponseBody>>


0

Я вирішив цю проблему дуже легко після того, як з'ясувати , це відбувається , коли ви не виводячи правильний об'єкт JSON, я просто використав echo json_encode($arrayName);замістьprint_r($arrayName); With my php api.

Кожна мова програмування або принаймні більшість мов програмування повинна мати свою версію функцій json_encode()та json_decode()функцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.