Sử dụng JsonReader.setLenient (true) để chấp nhận JSON không đúng định dạng tại dòng 1 cột 1 đường dẫn $


105

Đây là lỗi gì? Làm thế nào tôi có thể sửa lỗi này? Ứng dụng của tôi đang chạy nhưng không thể tải dữ liệu. Và đây là Lỗi của tôi: Sử dụng JsonReader.setLenient (true) để chấp nhận JSON không đúng định dạng tại dòng 1 cột 1 đường dẫn $

Đây là mảnh vỡ của tôi:

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

a

CẬP NHẬT

Luôn luôn là lỗi này không phải về json của bạn, nó có thể là do bạn yêu cầu sai, để xử lý tốt hơn, trước tiên hãy kiểm tra yêu cầu của bạn trong bưu tá nếu bạn nhận được phản hồi sau đó so sánh phản hồi json với mô hình của bạn nếu không có gì sai thì lỗi này đến từ yêu cầu sai của bạn, cũng có thể xảy ra khi phản hồi của bạn không phải josn (trong một số trường hợp, phản hồi có thể là html)


Xin chỉ cho sản lượng mà bạn nhận được từresponse.body()
OneCricketeer

@ cricket_007 Tôi đã chỉnh sửa câu hỏi của mình và hiển thị kết quả của mình
erfan

Tôi không yêu cầu hình ảnh. Tôi đã yêu cầu bạn in ra giá trị có thể được trả về từ máy chủ.
OneCricketeer

1
Làm cách nào để bạn in một giá trị trong Java? System.out.println, Đúng? Trong Android, bạn có thể sử dụng Loglớp học, nhưng điều đó không quan trọng. Bạn không nhận được dữ liệu hoặc lỗi đang xảy ra tại hoặc xung quanh JSONResponse jsonResponse = response.body();. Tôi không biết cách khắc phục lỗi của bạn vì nó có thể liên quan đến mạng. Bạn sẽ có thể tự mình kiểm tra giá trị đó.
OneCricketeer

Tôi không phải là một trong hai, tôi đang cố gắng để dạy cho bạn làm thế nào để gỡ rối bất kỳ ứng dụng Java, không có gì thực sự Android cụ thể pro
OneCricketeer

Câu trả lời:


187

Đây là một vấn đề nổi tiếng và dựa trên câu trả lời này, bạn có thể thêm setLenient:

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

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

Bây giờ, nếu bạn thêm cái này vào trang bị thêm của mình , nó sẽ gây ra một lỗi khác:

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

Đây là một lỗi nổi tiếng khác mà bạn có thể tìm thấy câu trả lời tại đây (lỗi này có nghĩa là phản hồi máy chủ của bạn không được định dạng tốt); Vì vậy, hãy thay đổi phản hồi của máy chủ để trả về một cái gì đó:

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

Để hiểu rõ hơn, hãy so sánh phản hồi của bạn với Github api .

Đề xuất : để tìm hiểu điều gì đang xảy ra với request/responsetiện ích HttpLoggingInterceptorcủa bạn trong trang bị thêm của bạn .

Dựa trên câu trả lời này ServiceHelper của bạn sẽ là:

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

Cũng đừng quên thêm:

compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'

tôi chỉnh sửa giao diện câu hỏi của tôi. nhưng đưa ra cùng một lỗi: Sử dụng JsonReader.setLenient (true) để chấp nhận JSON không đúng định dạng tại dòng 1 cột 1 đường dẫn $. cũng thêm pic lỗi trong câu hỏi
erfan

@erfan xem câu trả lời đã chỉnh sửa; Vấn đề là do phản hồi của bạn từ máy chủ không đúng; loại bỏ "xung quanh tên thuộc tính và vấn đề sẽ được khắc phục.
Amir

1
{android: [{ver: "1.5", name: "Cupcace", api: "Api Level 3", pic: "pic2.jpg"}]} đây là json của tôi chính xác như ví dụ của bạn và vẫn bị lỗi: '(
erfan

{"android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, sửa bằng cách này
erfan

3
sử dụng này và nó sẽ cho bạn biết ngay tại sao json của bạn là sai jsonlint.com
Saik Caskey

11

Ngoài ra, vấn đề này xảy ra khi loại nội dung phản hồi không phải application/json. Trong trường hợp của tôi, loại nội dung phản hồi là text/htmlvà tôi gặp phải vấn đề này. Tôi đã thay đổi nó để application/jsonsau đó nó hoạt động.


6

Đã xảy ra lỗi khi hiểu trả về Loại Chỉ cần thêm Tiêu đề và nó sẽ giải quyết được vấn đề của bạn

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


1

Trong trường hợp của tôi ; những gì đã giải quyết vấn đề của tôi là .....

Bạn có thể có json như thế này, các phím không có " dấu ngoặc kép ....

{name: "test", phone: "2324234"}

Vì vậy, hãy thử bất kỳ Trình xác thực Json trực tuyến nào để đảm bảo bạn sử dụng đúng cú pháp ...

Json Validator trực tuyến


1

Sử dụng Moshi:

Khi xây dựng Dịch vụ trang bị thêm, hãy thêm .asLenient () vào MoshiConverterFactory của bạn. Bạn không cần ScalarsConverter. Nó sẽ trông giống như sau:

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

0

Tôi đã đối mặt với vấn đề này và tôi đã nghiên cứu và không nhận được gì, vì vậy tôi đã cố gắng và cuối cùng, tôi biết nguyên nhân của vấn đề này. vấn đề trên API, hãy đảm bảo rằng bạn có một tên biến tốt mà tôi đã sử dụng $ start_date và nó đã gây ra sự cố, vì vậy tôi thử $ startdate và nó hoạt động!

cũng như đảm bảo rằng bạn gửi tất cả tham số khai báo trên API, ví dụ: $ startdate = $ _POST ['startdate']; $ enddate = $ _POST ['enddate'];

bạn phải chuyển hai biến này từ trang bị thêm.

cũng như nếu bạn sử dụng ngày tháng trên câu lệnh SQL, hãy thử đặt nó vào bên trong '' như '2017-07-24'

Tôi hy vọng nó sẽ giúp bạn.


0

Vấn đề này bắt đầu xảy ra với tôi một cách đột ngột, vì vậy tôi chắc chắn, có thể có một số lý do khác. Khi đào sâu, đó là một vấn đề đơn giản mà tôi đã sử dụng httptrong BaseUrl của Retrofit thay vì https. Vì vậy, thay đổi nó để httpsgiải quyết vấn đề cho tôi.


0

Cũng đáng để kiểm tra là nếu có bất kỳ lỗi nào trong kiểu trả về của các phương thức giao diện của bạn. Tôi có thể tái tạo vấn đề này bằng cách có loại trả lại không mong muốn nhưCall<Call<ResponseBody>>


0

Tôi đã giải quyết vấn đề này rất dễ dàng sau khi phát hiện ra điều này xảy ra khi bạn không xuất một đối tượng JSON thích hợp, tôi chỉ đơn giản sử dụng echo json_encode($arrayName);thay vì print_r($arrayName);Với api php của tôi.

Mọi ngôn ngữ lập trình hoặc ít nhất là hầu hết các ngôn ngữ lập trình nên có phiên bản json_encode()json_decode()chức năng của riêng chúng .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.