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 응답을 모델과 비교하십시오.이 오류는 잘못된 요청에서 비롯된 것입니다. 또한 귀하의 응답이 josn이 아닐 때 발생할 수 있습니다 (어떤 경우에는 응답이 html 일 수 있음)


당신이받은 결과물을 보여주세요response.body()
OneCricketeer

@ cricket_007의 전 편집 내 질문은 내 결과를 보여줍니다
에판

나는 이미지를 요구하지 않았다. 서버에서 반환 될 수있는 값을 인쇄 해달라고 요청했습니다.
OneCricketeer

1
Java에서 값을 어떻게 인쇄합니까? System.out.println, 예? Android에서는 Log수업을 사용할 수 있지만 중요하지 않습니다. 데이터를받지 못하거나에서 또는 그 주변에서 오류가 발생했습니다 JSONResponse jsonResponse = response.body();. 네트워킹 관련 일 수 있으므로 오류를 수정하는 방법을 모르겠습니다. 이 값을 직접 검사 할 수 있어야합니다.
OneCricketeer

나는 프로 중 하나, 내가 어떻게 자바 응용 프로그램을 디버깅하는 방법을 가르쳐하기 위해 노력하고있어, 아무것도 정말 안드로이드 특정 아니에요
OneCricketeer

답변:


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 열 경로 $에서 잘못된 JSON을 허용하십시오. 또한 문제의 오류 그림을 추가
에판

@erfan은 편집 된 답변을 참조하십시오. 서버에서 응답이기 때문에 문제는 되지 올바른; 속성 이름 주변의 "를 제거하고 문제가 수정됩니다.
Amir

1
{android : [{ver : "1.5", name : "Cupcace", api : "Api Level 3", pic : "pic2.jpg"}]} 이것은 내 예제와 똑같은 내 json이고 여전히 동일한 오류입니다. '(
erfan

{ "android": [{ "ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]},이 방법으로 수정
erfan

3
이것을 사용하여 JSON이 잘못 바로 왜 당신을 말할 것이다 jsonlint.com이
Saik 캐 스키

11

또한이 문제는 응답 콘텐츠 유형이 application/json. 제 경우에는 응답 내용 유형이 있었고이 text/html문제에 직면했습니다. 나는 그것을 application/json그때로 바꾸었다 .


6

반환 유형 이해에 오류가 있습니다. 헤더 만 추가하면 문제가 해결됩니다.

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


1

나의 경우에는 ; 내 문제를 해결 한 것은 .....

당신은 이런 json, " 따옴표가 없는 키 ....

{이름 : "test", 전화 번호 : "2324234"}

따라서 온라인 Json Validator를 사용하여 올바른 구문이 있는지 확인하십시오.

Json Validator 온라인


1

Moshi 사용 :

Retrofit 서비스를 빌드 할 때 MoshiConverterFactory에 .asLenient ()를 추가하십시오. 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들 때 .NET 대신 Retrofit의 BaseUrl에서 사용한 간단한 문제 였습니다 https. 그래서 그것을 변경 https하여 문제 를 해결했습니다.


0

또한 인터페이스 메서드의 반환 유형에 오류가 있는지 확인할 가치가 있습니다. 다음과 같은 의도하지 않은 반환 유형을 사용하여이 문제를 재현 할 수 있습니다.Call<Call<ResponseBody>>


0

적절한 JSON 객체를 출력하지 않을 때 이런 일이 발생한다는 것을 알게 된 후이 문제를 매우 쉽게 해결했습니다. echo json_encode($arrayName);대신 print_r($arrayName);With my php api를 사용했습니다.

모든 프로그래밍 언어 또는 최소한 대부분의 프로그래밍 언어에는 자체 버전의 json_encode()json_decode()함수 가 있어야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.