为了账号安全,请及时绑定邮箱和手机立即绑定

使用JsonReader.setLenient(true)在第1行第1列路径$接受格式错误的JSON

/ 猿问

使用JsonReader.setLenient(true)在第1行第1列路径$接受格式错误的JSON

慕后森 2019-12-26 13:46:11

这是什么错误?我怎样才能解决这个问题?我的应用程序正在运行,但无法加载数据。这是我的错误:使用JsonReader.setLenient(true)在第1行第1列路径$接受格式错误的JSON


这是我的片段:


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


总是这个错误与您的json无关,可能是来自错误的请求,为了更好地处理,首先请在邮递员中检查您的请求(如果您得到了响应),然后将您的json响应与您的模型进行比较(如果没有错误的话),则该错误来自错误的请求,当您的响应未启动时也可能发生(在某些情况下响应可能是html)


查看完整描述

3 回答

?
郎朗坤

这是一个众所周知的问题,根据此答案,您可以添加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'


查看完整回答
反对 回复 2019-12-26
?
慕雪9262066

当响应内容类型不是时,也会发生此问题application/json。在我的情况下,响应内容类型为text/html,我遇到了这个问题。我将其更改为application/json工作。


查看完整回答
反对 回复 2019-12-26
?
饮歌长啸

我在https://stackoverflow.com/a/57245058/8968137上遇到了同样的问题,并且在修复了google-services.json之后都解决了


查看完整回答
反对 回复 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信