Используйте 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;
}
}

RequestInterface:

public interface RequestInterface {

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

а

ОБНОВИТЬ

всегда эта ошибка не связана с вашим json, это может быть связано с вашим неправильным запросом, для лучшей обработки сначала проверьте свой запрос в почтальоне, если вы получили ответ, затем сравните свой ответ json с вашей моделью, если все в порядке, тогда эта ошибка возникла из-за вашего неправильного запроса, также это могло произойти, когда ваш ответ не josn (в некоторых случаях ответ может быть html)

Эрфан
источник
Пожалуйста, покажите результат, который вы получили отresponse.body()
OneCricketeer
@ cricket_007 Я редактирую свой вопрос и показываю свои результаты
erfan
Я не просил изображения. Я просил вас распечатать значение, которое может быть возвращено сервером.
OneCricketeer 08
1
Как напечатать значение в Java? System.out.println, да? В Android вы можете использовать этот Logкласс, но это не имеет значения. Вы не получаете данные или происходит ошибка поблизости или поблизости JSONResponse jsonResponse = response.body();. Я не знаю, как исправить вашу ошибку, потому что это может быть связано с сетью. Вы должны суметь проверить это значение самостоятельно.
OneCricketeer
Я тоже не профессионал, я пытаюсь научить вас отлаживать любое Java-приложение, ничего особенного для Android
OneCricketeer

Ответы:

188

Это хорошо известная проблема, и на основе этого ответа вы можете добавить 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, и та же ошибка: '(
erfan
{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, исправить этим способом
erfan
3
используйте это, и он сразу скажет вам, почему ваш json неправильный jsonlint.com
Сайк Каски
11

Также эта проблема возникает, когда тип содержимого ответа - нет application/json. В моем случае тип содержимого ответа был, text/htmlи я столкнулся с этой проблемой. Я изменил его, чтобы application/jsonон работал.

Али Гюрелли
источник
6

Произошла ошибка в понимании возвращаемого типа. Просто добавьте заголовок, и это решит вашу проблему.

@Headers("Content-Type: application/json")
Джаханзаиб
источник
1

В моем случае ; что решило мою проблему ...

У вас может быть такой json, ключи без " двойных кавычек ...."

{name: "test", телефон: "2324234"}

Поэтому попробуйте любой онлайн-валидатор Json, чтобы убедиться, что у вас правильный синтаксис ...

Json Validator онлайн

Шариф
источник
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 ['дата окончания'];

вы должны передать эти две переменные из модификации.

также, если вы используете дату в операторе SQL, попробуйте поместить его внутри '', например, '2017-07-24'

Надеюсь, это вам поможет.

Момен Закут
источник
0

Эта проблема стала возникать у меня внезапно, поэтому я был уверен, что может быть другая причина. Если копнуть глубже, это была простая проблема, когда я использовал httpв BaseUrl of Retrofit вместо https. Поэтому изменив его, чтобы httpsрешить проблему для меня.

Шубхрал
источник
0

Также стоит проверить, есть ли ошибки в типе возврата ваших методов интерфейса. Я мог бы воспроизвести эту проблему, указав непреднамеренный тип возврата, напримерCall<Call<ResponseBody>>

Роуленд Мтетези
источник
0

Я решил эту проблему очень легко, узнав, что это происходит, когда вы не выводите правильный объект JSON, я просто использовал echo json_encode($arrayName);вместо print_r($arrayName);с моим php api.

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

Джевон
источник