Use JsonReader.setLenient (true) para aceitar JSON malformado na linha 1, coluna 1, caminho $

105

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();
}

uma

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)

Erfan
fonte
Mostre o resultado que você recebeu deresponse.body()
OneCricketeer
@ cricket_007 edito minha pergunta e mostro meus resultados
erfan,
Não pedi imagens. Pedi para você imprimir o valor que talvez seja retornado do servidor.
OneCricketeer
1
Como você imprime um valor em Java? System.out.println, sim? No Android você pode usar a Logclasse, mas isso não importa. Você não está recebendo dados ou um erro está ocorrendo em ou em torno JSONResponse 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.
OneCricketeer
Também não sou um profissional, estou tentando ensinar a você como depurar qualquer aplicativo Java, nada realmente específico do Android
OneCricketeer

Respostas:

187

Este é um problema bem conhecido e com base nesta resposta, você pode adicionar setLenient:

Gson gson = new GsonBuilder()
        .setLenient()
        .create();

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

Agora, se você adicionar isso ao seu retrofit , ocorrerá outro erro:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

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:

{
    android:[
        { ver:"1.5", name:"Cupcace", api:"Api Level 3" }
        ...
    ]
}

Para melhor compreensão, compare sua resposta com Github api .

Sugestão : descobrir o que está acontecendo com seu request/responseadd HttpLoggingInterceptorem seu retrofit .

Com base nesta resposta, seu ServiceHelper seria:

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);
    }

Também não se esqueça de adicionar:

compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
Amir
fonte
eu edito minha aparência de pergunta. mas dá o mesmo erro: Use JsonReader.setLenient (true) para aceitar JSON malformado na linha 1, coluna 1, caminho $. também adicionar imagem de erro em questão
Erfan
@erfan veja a resposta editada; O problema é que sua resposta do servidor não está correta; remove "em torno do nome do atributo e o problema será corrigido.
Amir
1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} este é meu json exatamente como seu exemplo e ainda o mesmo erro: '(
Erfan
{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, corrija desta forma
erfan
3
use isso e ele lhe dirá imediatamente porque seu json está errado jsonlint.com
Caskey
11

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 era text/htmle eu enfrentei esse problema. Eu mudei para application/jsonentão funcionou.

Ali Gürelli
fonte
6

Ocorreu um erro na compreensão do tipo de retorno Basta adicionar o cabeçalho e isso resolverá o seu problema

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

No meu caso ; o que resolveu meu problema foi ...

Você pode ter json assim, as chaves sem " aspas duplas ....

{nome: "teste", telefone: "2324234"}

Portanto, experimente qualquer Json Validator online para se certificar de que tem a sintaxe correta ...

Json Validator Online

Shareef
fonte
1

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:

return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(ENDPOINT)
                .addConverterFactory(MoshiConverterFactory.create().asLenient())
                .build()
                .create(UserService::class.java)
André Ramon
fonte
0

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ê.

Momen Zaqout
fonte
0

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 httpno BaseUrl do Retrofit em vez de https. Portanto, alterá-lo para httpsresolveu o problema para mim.

Shubhral
fonte
0

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 comoCall<Call<ResponseBody>>

Rowland Mtetezi
fonte
0

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 de print_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()e json_decode().

Jevon
fonte