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

这个错误是什么?我该怎么补救?我的应用程序正在运行,但无法加载数据。这是我的错误: 使用 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;
}
}

请求接口:

public interface RequestInterface {


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

a

更新(阅读下面的文字,找到你的问题)

  • 大多数情况下,这个错误与您的 json 无关,但它可能是一个 不正确的 http 请求,如丢失或不正确的标头,首先请邮递员检查您的请求,以验证服务器响应和服务器响应标头。如果没有任何错误,那么错误主要来自您编程的 http 请求,也可能是因为服务器响应不是 json (在某些情况下响应可能是 html)。
315288 次浏览

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

根据 这个的答案,你的 服务助理应该是:

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'

我已经面对这个问题,我做了研究,没有得到任何东西,所以我尝试,最后,我知道这个问题的原因。 关于 API 的问题,请确保您有一个好的变量名 我使用 $start _ date 并且它导致了问题,所以我尝试使用 $startdate 并且它可以工作!

以及确保发送所有在 API 上声明的参数,例如, $startdate = $_ POST [‘ startdate’] ; $enddate = $_ POST [‘ enddate’] ;

你必须通过这两个变量从改造。

还有,如果你在 SQL 语句中使用 date,试着把它放在里面” 比如2017-07-24

希望能帮到你。

当响应内容类型不是 application/json时也会发生此问题。在我的案例响应内容类型是 text/html,我面临这个问题。我把它改成 application/json然后就成功了。

这个问题突然发生在我身上,所以我肯定,可能有其他原因。在深入研究的时候,发现这是一个简单的问题,我在 BaseUrl of Afterfit 中使用的是 http,而不是 https。所以把它改成 https解决了我的问题。

在理解返回类型方面有一个错误 只要添加标题,它将解决您的问题

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

就我而言,解决我问题的是... ..。

你可能有这样的 json,没有 双倍报价的钥匙... 。

{ name: “ test”,phone: “2324234”}

因此,尝试任何在线 Json 验证器,以确保您有正确的语法..。

Json Validator 在线

我有同样的问题随着 https://stackoverflow.com/a/57245058/8968137和都解决后,修复谷歌服务。 json

同样值得检查的是接口方法的返回类型是否有错误。我可以通过使用非预期的返回类型(如 Call<Call<ResponseBody>>)来重现这个问题

使用莫希:

当建立您的翻新服务添加。对你的 MoshiConverterFactory 的宽容()。你不需要 ScalarsConverter。它应该是这样的:

return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(ENDPOINT)
.addConverterFactory(MoshiConverterFactory.create().asLenient())
.build()
.create(UserService::class.java)

在发现这种情况发生在没有输出正确的 JSON 对象时,我很容易地解决了这个问题,我只是在 php api 中使用了 echo json_encode($arrayName);而不是 print_r($arrayName);

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

我的情况下,我忘记了添加@Header (“ Accept: application/json”) ,并有重定向在 http 页面,与身体雷泽 json 的 html

有时会显示错误,因为相对链接无法在基本 URL 中找到数据; 我经历了同样的问题和反检查,有没有错误之间的相对网址和基地网址的工作

我花了大约3个小时解决了这个问题。我已经用邮递员的 Api 测试。 Json 输出出现了错误。请查看图片以获得更多说明(当输出预览从输入图片描述 JSON 改为 HTML 时,我得到了这个错误) Output Viewed in HTML

Output Viewed in JSON