Que erro é esse? Como posso consertar isso? Meu aplicativo está em execução, mas não consegue carregar os dados. E este é o meu erro: use JsonReader.setLenient (true) para aceitar JSON malformado na linha 1, coluna 1, caminho $
Este é o meu fragmento:
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();
}
ATUALIZAR
sempre este erro não é sobre seu json, pode vir de sua solicitação errada, para melhor lidar primeiro verifique sua solicitação no carteiro se você obteve resposta, então compare sua resposta json com seu modelo se nada estiver errado então este erro vem de sua solicitação errada, também pode acontecer quando sua resposta não é josn (em alguns casos a resposta pode ser html)
response.body()
System.out.println
, sim? No Android você pode usar aLog
classe, mas isso não importa. Você não está recebendo dados ou um erro está ocorrendo em ou em tornoJSONResponse jsonResponse = response.body();
. Não sei como consertar seu erro porque pode estar relacionado à rede. Você deve ser capaz de inspecionar esse valor por conta própria.Respostas:
Este é um problema bem conhecido e com base nesta resposta, você pode adicionar
setLenient
:Agora, se você adicionar isso ao seu retrofit , ocorrerá outro erro:
Este é outro erro conhecido que você pode encontrar resposta aqui (este erro significa que a resposta do servidor não está bem formatada); Portanto, altere a resposta do servidor para retornar algo:
Para melhor compreensão, compare sua resposta com Github api .
Sugestão : descobrir o que está acontecendo com seu
request/response
addHttpLoggingInterceptor
em seu retrofit .Com base nesta resposta, seu ServiceHelper seria:
Também não se esqueça de adicionar:
fonte
Além disso, esse problema ocorre quando o tipo de conteúdo de resposta não é
application/json
. No meu caso, o tipo de conteúdo de resposta eratext/html
e eu enfrentei esse problema. Eu mudei paraapplication/json
então funcionou.fonte
Ocorreu um erro na compreensão do tipo de retorno Basta adicionar o cabeçalho e isso resolverá o seu problema
fonte
Tive o mesmo problema junto com https://stackoverflow.com/a/57245058/8968137 e ambos resolvidos após corrigir o google-services.json
fonte
No meu caso ; o que resolveu meu problema foi ...
Você pode ter json assim, as chaves sem " aspas duplas ....
Portanto, experimente qualquer Json Validator online para se certificar de que tem a sintaxe correta ...
Json Validator Online
fonte
Usando Moshi:
Ao criar seu serviço de retrofit, adicione .asLenient () à sua MoshiConverterFactory. Você não precisa de um ScalarsConverter. Deve ser parecido com isto:
fonte
Já enfrentei esse problema e fiz pesquisas e não achei nada, então fui tentando e finalmente, conheci a causa desse problema. o problema na API, certifique-se de que você tem um bom nome de variável Eu usei $ start_date e isso causou o problema, então tento $ startdate e funciona!
também certifique-se de enviar todos os parâmetros que declaram na API, por exemplo, $ startdate = $ _POST ['startdate']; $ enddate = $ _POST ['enddate'];
você tem que passar essas duas variáveis do retrofit.
também, se você usar data na instrução SQL, tente colocá-la dentro de '' como '2017-07-24'
Espero que ajude você.
fonte
Esse problema começou a ocorrer para mim de repente, então eu tinha certeza de que poderia haver algum outro motivo. No aprofundamento, foi um problema simples onde usei
http
no BaseUrl do Retrofit em vez dehttps
. Portanto, alterá-lo parahttps
resolveu o problema para mim.fonte
Também vale a pena verificar se há algum erro no tipo de retorno de seus métodos de interface. Eu poderia reproduzir esse problema tendo um tipo de retorno não intencional como
Call<Call<ResponseBody>>
fonte
Resolvi esse problema muito facilmente depois de descobrir que isso acontece quando você não está gerando um objeto JSON adequado, simplesmente usei o em
echo json_encode($arrayName);
vez deprint_r($arrayName);
With my php api.Cada linguagem de programação ou pelo menos a maioria das linguagens de programação deve ter sua própria versão das funções
json_encode()
ejson_decode()
.fonte