这是什么错误?我怎样才能解决这个问题?我的应用正在运行,但无法加载数据。这是我的错误:使用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响应与你的模型,如果没有错,那么这个错误来自你的错误请求,也可能发生在你的回答不是josn(在某些情况下响应)也许是html)
答案 0 :(得分:114)
这是一个众所周知的问题,基于this答案,您可以添加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 $
这是另一个众所周知的错误,您可以找到答案here(此错误表示您的服务器响应格式不正确);因此,更改服务器响应以返回一些内容:
{
android:[
{ ver:"1.5", name:"Cupcace", api:"Api Level 3" }
...
]
}
为了更好地理解,请将您的回答与Github api进行比较。
建议:了解改造中request/response
添加HttpLoggingInterceptor
的内容。
根据this回答您的 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'
答案 1 :(得分:8)
当响应内容类型不是application/json
时,也会出现此问题。在我的情况下,响应内容类型是text/html
,我遇到了这个问题。我将其更改为application/json
然后才有效。
答案 2 :(得分:1)
了解返回类型时出错 只需添加Header即可解决您的问题
@Headers("Content-Type: application/json")
答案 3 :(得分:0)
我遇到了这个问题并且我做了研究并且没有得到任何东西,所以我在尝试,最后,我知道这个问题的原因。 API上的问题,请确保您有一个好的变量名称 我使用$ start_date导致了问题,所以我尝试$ startdate并且它有效!
同时确保发送在API上声明的所有参数,例如, $ startdate = $ _POST [&#39; startdate&#39;]; $ enddate = $ _POST [&#39; enddate&#39;];
你必须从改造中传递这两个变量。
如果你在SQL语句上使用日期,试着把它放在&#39;&#39; 喜欢&#39; 2017-07-24&#39;
我希望它可以帮到你。
答案 4 :(得分:0)
如果您的JSON格式可以,请检查数据库查询。尝试更改它们,然后重试
答案 5 :(得分:0)
这个问题突然开始出现在我身上,所以我确定可能还有其他原因。在深入研究时,这是一个简单的问题,我在Retrofit的BaseUrl中使用http
而不是https
。因此,将其更改为https
对我来说解决了这个问题。
答案 6 :(得分:0)
就我而言;解决我问题的是.....
您可能会有这样的json,其中的键不带“ 双引号。...
{名称:“ test”,电话:“ 2324234”}
因此,请尝试使用任何在线Json Validator来确保语法正确...
答案 7 :(得分:0)
我和https://stackoverflow.com/a/57245058/8968137都有相同的问题,并且在修复google-services.json后都解决了
答案 8 :(得分:0)
还值得检查的是,接口方法的返回类型是否存在任何错误。我可以通过使用意外的返回类型(例如Call<Call<ResponseBody>>
答案 9 :(得分:0)
使用Moshi:
在构建改造服务时,将.asLenient()添加到MoshiConverterFactory。您不需要ScalarsConverter。它应该看起来像这样:
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(ENDPOINT)
.addConverterFactory(MoshiConverterFactory.create().asLenient())
.build()
.create(UserService::class.java)
答案 10 :(得分:0)
我发现当您没有输出正确的JSON对象时会发生此问题,因此我很轻松地解决了这个问题,我只是将echo json_encode($arrayName);
而不是print_r($arrayName);
与我的php API一起使用。
每种编程语言或至少大多数编程语言应具有自己的json_encode()
和json_decode()
函数版本。
答案 11 :(得分:0)
在我的情况下,我忘记将 @Headers("Accept: application/json") 添加到 Retrofit 并在 http 页面上重定向,在 body razer json 中使用 html