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


105

这是什么错误?我怎样才能解决这个问题?我的应用程序正在运行,但无法加载数据。这是我的错误:使用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();

        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响应与您的模型进行比较,如果没有错的话,则该错误来自错误的请求,当您的响应未启动时也可能发生(在某些情况下响应可能是html)


请显示您从response.body()
OneCricketeer 2016年

@ cricket_007我编辑我的问题并显示我的结果
erfan

我没有要求图像。我要求您打印出可能从服务器返回的值。
OneCricketeer

1
如何用Java打印值?System.out.println,是吗?在Android中,您可以使用Log该类,但这无关紧要。您没有获取数据,或者在附近发生错误JSONResponse jsonResponse = response.body();。我不知道如何解决您的错误,因为它可能与网络相关。您应该能够自己检查该值。
OneCricketeer

我也不是专业人士,我想教你如何调试任何Java应用程序,而没有真正针对Android的调试
OneCricketeer

Answers:


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)在第1行第1列path $接受格式错误的JSON。还添加有问题的错误图片
erfan

@erfan查看修改后的答案;问题是因为您从服务器收到的响应正确;删除“属性名称周围,问题将得到解决
阿米尔

1
{android:[{ver:“ 1.5”,名称:“ Cupcace”,api:“ Api Level 3”,pic:“ pic2.jpg”}]}}
erfan

{“ 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

了解返回类型时出错,只需添加标题即可解决您的问题

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


1

就我而言; 解决我问题的是.....

您可能会有这样的json,其中的键没有“ 引号...。

{名称:“ test”,电话:“ 2324234”}

因此,请尝试使用任何在线Json Validator来确保语法正确...

Json在线验证器


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 ['enddate'];

您必须从改造中传递这两个变量。

同样,如果您在SQL语句上使用日期,请尝试将其放在'''2017-07-24'之内

希望对您有帮助。


0

这个问题突然开始出现在我身上,所以我确定可能还有其他原因。在深入研究时,这是一个简单的问题,我http在Retrofit的BaseUrl中使用而不是https。因此,更改它可以https为我解决问题。



0

在发现当您没有输出适当的JSON对象时会发生这种情况后,我非常轻松地解决了此问题,我只是使用了echo json_encode($arrayName);代替print_r($arrayName);搭配我的php API。

每种编程语言或至少大多数编程语言都应具有自己的json_encode()and json_decode()函数版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.