पंक्ति 1 कॉलम 1 पथ $ पर विकृत JSON को स्वीकार करने के लिए JsonReader.setLenient (सत्य) का उपयोग करें


105

यह क्या त्रुटि है? मैं इसे कैसे ठीक करूं? मेरा ऐप चल रहा है लेकिन डेटा लोड नहीं किया जा सकता। और यह मेरी त्रुटि है: पंक्ति 1 पथ $ $ पर विकृत JSON को स्वीकार करने के लिए JsonReader.setLenient (सत्य) का उपयोग करें

यह मेरा टुकड़ा है:

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

अनुरोध सूची:

public interface RequestInterface {

@GET("Erfan/news.php")
Call<JSONResponse> getJSON();
}

ए

अपडेट करें

हमेशा यह त्रुटि आपके json के बारे में नहीं है, यह आपके गलत अनुरोध से बन सकता है, बेहतर तरीके से हैंडल करने के लिए पहले डाकिया में अपने अनुरोध की जांच करें यदि आपको प्रतिक्रिया मिली है तो अपने मॉडल के साथ अपने json प्रतिक्रिया की तुलना करें यदि कुछ भी गलत नहीं है, तो यह त्रुटि आपके गलत अनुरोध से आती है, यह भी हो सकता है जब आपकी प्रतिक्रिया josn नहीं (कुछ मामलों में प्रतिक्रिया html हो सकती है)


कृपया उस आउटपुट को दिखाएं जो आपको प्राप्त होता हैresponse.body()
OneCricketeer

@ cricket_007 मैं संपादित करें मेरे सवाल और मेरे परिणाम बताते हैं
erfan

मैंने चित्र नहीं मांगे। मैंने आपको उस मूल्य को प्रिंट करने के लिए कहा है जो शायद सर्वर से वापस आ गया है।
OneCricketeer

1
आप जावा में मूल्य कैसे प्रिंट करते हैं? System.out.println, हाँ? एंड्रॉइड में आप 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'

मैं अपने सवाल देखो संपादित करें। लेकिन एक ही त्रुटि दें: लाइन 1 कॉलम $ $ पर विकृत JSON को स्वीकार करने के लिए JsonReader.setLenient (सत्य) का उपयोग करें। प्रश्न में त्रुटि चित्र भी जोड़ें
erfan

@erfan संपादित उत्तर देखें; मुद्दा यह है क्योंकि सर्वर से आपकी प्रतिक्रिया सही नहीं है; निकालें "के आसपास विशेषता नाम और मुद्दा तय हो जाएगा।
अमीर

1
{android: [{ver: "1.5", नाम: "क्यूपेकस", एपी: "आपी लेवल 3", pic: "pic2.jpg"}]}} यह मेरा json उर उदाहरण की तरह सटीक है और अभी भी वही त्रुटि है: '(
इरफान

{"Android": [{"ver": "1.5", "name": "Cupcace", "api": "level3", "pic": "bane.jpg"}]}, इस तरह से ठीक करें
eranan

3
इस का उपयोग करें और यह आपको तुरंत बताएगा कि आपका json गलत क्यों है jsonlint.com
Saik Caskey

11

जब प्रतिक्रिया contenttype नहीं है, तो भी यह समस्या उत्पन्न होती है application/json। मेरे मामले में प्रतिक्रिया contenttype थी text/htmlऔर मुझे इस समस्या का सामना करना पड़ा। मैंने इसे बदल दिया application/jsonतब यह काम किया।


6

रिटर्न की समझ में एक त्रुटि थी टाइप करें हैडर जोड़ें और यह आपकी समस्या को हल करेगा

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


1

मेरे मामले में ; मेरा मुद्दा क्या हल हुआ .....

आपके पास इस तरह से json हो सकता है, " दोहरे उद्धरणों के बिना" कुंजी ।

{नाम: "परीक्षण", फोन: "2324234"}

तो किसी भी ऑनलाइन Json Validator का प्रयास करें सुनिश्चित करें कि आपके पास सही वाक्यविन्यास है ...

Json वैध ऑनलाइन


1

मोशी का उपयोग करना:

अपनी सेवा का निर्माण करते समय अपने MoshiConverterFactory में .asient () जोड़ें। आपको ScalarsConverter की आवश्यकता नहीं है। यह कुछ इस तरह दिखना चाहिए:

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

0

मैंने इस समस्या का सामना किया है और मैंने अनुसंधान किया और कुछ भी नहीं मिला, इसलिए मैं कोशिश कर रहा था और आखिरकार, मुझे इस समस्या का कारण पता चला। एपीआई पर समस्या, सुनिश्चित करें कि आपके पास एक अच्छा चर नाम है जिसका मैंने $ start_date उपयोग किया है और यह समस्या का कारण है, इसलिए मैं $ startdate का प्रयास करता हूं और यह काम करता है!

जैसा कि आप एपीआई पर घोषित सभी पैरामीटर भेजते हैं, उदाहरण के लिए, $ startdate = $ _POST ['startdate] सुनिश्चित करें; $ enddate = $ _POST ['enddate'];

आपको रेट्रोफिट से इस दो वेरिएबल को पास करना होगा।

यदि आप एसक्यूएल स्टेटमेंट पर तारीख का उपयोग करते हैं, तो इसे '' 2017-07-24 '' के अंदर डालने का प्रयास करें।

मुझे उम्मीद है इससे आपको मदद मिली होगी।


0

यह समस्या मेरे लिए अचानक होने लगी, इसलिए मुझे यकीन था, कोई और कारण हो सकता है। गहरी खुदाई करने पर, यह एक साधारण मुद्दा था जहां मैंने httpइसके बजाय रेट्रोफिट के बेसयूआरएल में उपयोग किया था https। इसलिए httpsमेरे लिए इस मुद्दे को हल करने के लिए इसे बदलना ।


0

यह भी जाँचने योग्य है कि क्या आपके इंटरफ़ेस विधियों के रिटर्न प्रकार में कोई त्रुटि है। मैं इस मुद्दे को एक अनपेक्षित रिटर्न प्रकार की तरह पुन: पेश कर सकता थाCall<Call<ResponseBody>>


0

जब आप एक उचित JSON ऑब्जेक्ट को आउटपुट नहीं कर रहे हैं, तो यह पता लगाने के बाद मैंने इस समस्या को बहुत आसानी से हल कर लिया, मैंने echo json_encode($arrayName);इसके बजाय print_r($arrayName);मेरी php एपीआई के साथ उपयोग किया ।

प्रत्येक प्रोग्रामिंग भाषा या कम से कम अधिकांश प्रोग्रामिंग भाषाओं का अपना संस्करण json_encode()और json_decode()फ़ंक्शन होना चाहिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.