首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JsonReader.setLenient(true)在第1行、第1列、路径$接受格式错误的JSON

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

Stack Overflow用户
提问于 2016-10-07 21:46:24
回答 11查看 253.2K关注 0票数 138

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

这是我的片段:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
public interface RequestInterface {

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

更新(阅读下面的文本并找到您的问题)

  • 总是这个错误与你的json无关,它可能是你错误的请求,为了更好的处理,首先在postman中检查你的请求如果你得到了响应,然后比较你的json响应与你的模型如果没有什么问题,那么这个错误来自你的错误请求,也可能发生当你的响应不是josn (在某些情况下响应可能是html)

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2016-10-13 14:35:58

这是一个众所周知的问题,根据this答案,您可以添加setLenient

代码语言:javascript
运行
复制
Gson gson = new GsonBuilder()
        .setLenient()
        .create();

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

现在,如果您将此代码添加到您的retrofit中,则会显示另一个错误:

代码语言:javascript
运行
复制
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

这是另一个众所周知的错误,您可以找到答案here (此错误意味着您的服务器响应的格式不正确);因此,请更改服务器响应以返回以下内容:

代码语言:javascript
运行
复制
{
    android:[
        { ver:"1.5", name:"Cupcace", api:"Api Level 3" }
        ...
    ]
}

为了更好地理解,请将您的响应与Github api进行比较。

Suggestion:要找出您的request/response发生了什么,请在您的改造中添加HttpLoggingInterceptor

根据this回答,您的ServiceHelper将是:

代码语言:javascript
运行
复制
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);
    }

另外,别忘了添加:

代码语言:javascript
运行
复制
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
票数 236
EN

Stack Overflow用户

发布于 2018-04-09 22:02:24

同样,当响应contenttype不是application/json时,也会出现此问题。在我的案例中,响应contenttype是text/html,我遇到了这个问题。我把它改成了application/json,然后它就起作用了。

票数 15
EN

Stack Overflow用户

发布于 2019-11-16 08:17:44

使用Moshi的

在构建Retrofit服务时,将.asLenient()添加到您的MoshiConverterFactory。你不需要ScalarsConverter。它应该看起来像这样:

代码语言:javascript
运行
复制
return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(ENDPOINT)
                .addConverterFactory(MoshiConverterFactory.create().asLenient())
                .build()
                .create(UserService::class.java)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39918814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档