Android में JSON ऑब्जेक्ट्स भेजना और पार्स करना [बंद]


137

मैं JSON ऑब्जेक्ट के रूप में एक सर्वर पर संदेश भेजना चाहता हूं और सर्वर से JSON प्रतिक्रिया पार्स करना चाहता हूं।

JSON ऑब्जेक्ट का उदाहरण

{
  "post": {
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  }
}

मैं JSON को मैन्युअल रूप से विशेषता द्वारा पार्स करने की कोशिश कर रहा हूं। क्या इस प्रक्रिया को आसान बनाने के लिए कोई पुस्तकालय / उपयोगिता है जिसका मैं उपयोग कर सकता हूं?


2
वह URL अब उपलब्ध नहीं है ... क्या आप इसे अपडेट कर सकते हैं?
सिपि

1
यहाँ एक विस्तृत उदाहरण दिया गया है: Android - JSON पार्सिंग उदाहरण
परेश मेयानी

1
@ परेश मयानी और @ प्राइमैप .. मुझे पता है कि हम JSON का उपयोग कर सर्वर से डेटा को पॉप्युलेट कर सकते हैं, प्राप्त विधि का उपयोग करके सर्वर से प्राप्त कर सकते हैं, मैं इसके साथ सहज हूं .... लेकिन अगर हम डेटा को सर्वर पर भेजने के लिए पोस्ट विधि का उपयोग करते हैं, तो हम JSON के रूप में डेटा फिर से भेजते हैं, मैं प्राइमैप प्रश्न के उद्धरण का उल्लेख कर रहा हूं "मैं एक Jango सर्वर के रूप में JSON ऑब्जेक्ट के रूप में संदेश भेजना चाहूंगा" ..... मैं सर्वर पर मैसकॉल का उपयोग कर रहा हूं .... या मैं JSON वस्तु भेज रहा हूँ? ... क्या आप इस जानकारी को मेरे लिए स्पष्ट कर सकते हैं .... या कोई भी लिंक जो मुझे अवधारणा को समझने में मददगार होगा, धन्यवाद
Devrath

जवाबों:


118

मुझे आश्चर्य है कि इनका उल्लेख नहीं किया गया है: बल्कि नंगे-हड्डियों के बजाय मैन्युअल प्रक्रिया का उपयोग करते हुए json.org के छोटे पैकेज के साथ, GSON और जैक्सन उपयोग करने के लिए बहुत अधिक सुविधाजनक हैं। इसलिए:

तो आप वास्तव में अपने स्वयं के POJO से जुड़ सकते हैं, न कि कुछ आधे-झुके हुए पेड़ के नोड्स या सूचियाँ और मानचित्र। (और कम से कम जैक्सन ऐसी चीजों के लिए भी बाध्यकारी है (शायद GSON के रूप में अच्छी तरह से, निश्चित नहीं है), JsonNode, Map, List, यदि आप वास्तव में 'वास्तविक' वस्तुओं के बजाय ये चाहते हैं तो)

EDIT 19-MAR-2014:

एक और नया दावेदार जैक्सन जूनियर लाइब्रेरी है: यह जैक्सन ( jackson-core) के रूप में एक ही तेज़ स्ट्रीमिंग पार्सर / जनरेटर का उपयोग करता है , लेकिन डेटा-बाइंडिंग पार्ट छोटा है (50kB)। कार्यक्षमता अधिक सीमित है (कोई एनोटेशन नहीं, बस नियमित रूप से जावा बीन्स), लेकिन प्रदर्शन-वार तेज होना चाहिए, और आरंभीकरण (पहला-कॉल) ओवरहेड बहुत कम है। तो यह सिर्फ अच्छा विकल्प हो सकता है, खासकर छोटे ऐप्स के लिए।


10
GSON के लिए +1। हम विशेष रूप से GSON की स्ट्रीमिंग के समर्थन का इस्तेमाल किया है sites.google.com/site/gson/streaming हमारे एंड्रॉयड क्षुधा में।
आंद्रे स्टिंग्रेस

FWIW, जैक्सन में स्ट्रीमिंग API भी है: wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
GSON स्ट्रीमिंग के लिए भी +1। जैक्सन स्ट्रीमिंग को पहले लागू किया गया था, लेकिन हालांकि डिबग संस्करण में कार्यात्मक, ProGuard ने त्रुटियों और रिलीज़ संस्करण के टन उत्पन्न किए जो क्रैश का कारण बनते हैं। मुझे यकीन है कि यह कोई जैक्सन से संबंधित मुद्दा नहीं है, लेकिन इसने मुझे जीएसओएन पर स्विच कर दिया, जिसने ठीक काम किया और केवल स्ट्रीमिंग के लिए अतिरिक्त 14kB की आवश्यकता थी।
जुआन

और बेवकूफ अप्रतिरोध्य जोंस मिश्रण स्ट्रिंग और सूचियों के लिए पूर्व: ["टोटो", "ताता", ["मोंटी", ["टोर", "अजगर"]]? (एक प्रकार का डेटा संरचना जिसमें इसका उपयोग करने के लिए पुनरावर्ती कार्यों की आवश्यकता होती है)
क्रिस्तोफ़े

85

आप org.json.JSONObject और org.json.JSONTokener का उपयोग कर सकते हैं । एंड्रॉइड एसडीके के साथ इन कक्षाओं के आने के बाद आपको किसी बाहरी लाइब्रेरी की आवश्यकता नहीं है


ऊप्स! मैंने यह खो दिया। वास्तव में, वे वेबसाइट पर org.json लाइब्रेरी हैं।
गौरव वैश्य

यह वही है जो मैं उपयोग करता हूं, और यह एक आकर्षण की तरह काम करता है।
एडम

यह बहुत अच्छा होगा यदि कोई उदाहरण या उसी का लिंक दिया जा सके। इस तरह से सीखना आसान है। :)
प्रेमल पप्पाचन


1
बहुत अधिक सुविधा, लिखने के लिए कम कोड: दर्जनों के बजाय एक या दो लाइनें।
स्टैक्मैन मैन 14'10

31

GSON का उपयोग करना सबसे आसान है और यदि डेटा की निश्चित संरचना है तो जाने का रास्ता।

गन्स डाउनलोड करें

इसे संदर्भित पुस्तकालयों में जोड़ें।

package com.tut.JSON;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class SimpleJson extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String jString = "{\"username\": \"tom\", \"message\": \"roger that\"}  ";


        GsonBuilder gsonb = new GsonBuilder();
        Gson gson = gsonb.create();
        Post pst;

        try {
            pst = gson.fromJson(jString,  Post.class);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

पोस्ट क्लास के लिए कोड

package com.tut.JSON;

public class Post {

    String message;
    String time;
    String username;
    Bitmap icon;
}

4
इसके लायक क्या है, कोड को सरल बनाया जा सकता है: कि JSONObject रूपांतरण अनावश्यक है। और बस्ती और गेटर्स जीसॉन के लिए वैकल्पिक हैं; जोड़ा जा सकता है अगर एक चाहता है, लेकिन सख्ती से आवश्यक नहीं है।
स्टैक्मैन मैन 15'10

4
बस स्टैक्समैन की टिप्पणी को स्पष्ट करने के लिए। आपका उदाहरण jringring ले रहा है, इसे JSONObject में रूपांतरित कर रहा है, फिर इसे वापस पढ़ने के लिए स्ट्रिंग में परिवर्तित कर रहा है। बस pst = gson.fromJson (jString, Post.class) का उपयोग करें। मेरा मानना ​​है कि इससे ट्राइ-कैच की जरूरत से भी छुटकारा मिलेगा। और जैसा कि StaxMan भी बताते हैं, Post.class में बसने और पाने वालों का कोई मूल्य नहीं है। अपने उदाहरण को सही करने के लिए यह दूसरों के लिए उपयोगी होगा।
मैट

मैं इस सवाल का जवाब से दोहरे रूपांतरण हिस्सा निकाल दिया
whlk

4

यह JsonParser वर्ग है

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

नोट: DefaultHttpClient अब sdk 23 द्वारा समर्थित नहीं है, इसलिए इस कोड के साथ लक्ष्य sdk 21 का उपयोग करना उचित है।


3

वास्तव में JSON के लिए कुछ भी नहीं है। घुंघराले कोष्ठक "ऑब्जेक्ट्स" (साहचर्य सरणियों) के लिए हैं और वर्गाकार कोष्ठक बिना कुंजियों के (संख्यात्मक रूप से अनुक्रमित) सरणियों के लिए हैं। जहां तक ​​एंड्रॉइड में इसके साथ काम करने की बात है, तो इसके लिए तैयार कक्षाएं हैं जो एसडीके में शामिल हैं (डाउनलोड की आवश्यकता नहीं है)।

इन कक्षाओं की जाँच करें: http://developer.android.com/reference/org/json/package-summary.html


मुझे लगता है आप घुंघराले ब्रेसिज़ का मतलब है और कोणीय कोष्ठक नहीं!
गौरव वैश्य

2

अन्य उत्तरों में जैक्सन और जीएसओएन - एंड्रॉइड के लिए लोकप्रिय ऐड-ऑन JSON लाइब्रेरी, और json.org, नंगे-हड्डियों JSON पैकेज का उल्लेख किया गया है, जो एंड्रॉइड में शामिल है।

लेकिन मुझे लगता है कि यह भी ध्यान देने योग्य है कि एंड्रॉइड का अपना पूर्ण विशेषताओं वाला JSON API है।

इसे हनीकॉम्ब: एपीआई स्तर 11 में जोड़ा गया था।

इसमें शामिल हैं
- android.util.JsonReader: डॉक्स , और स्रोत
- android.util.JsonWriter: डॉक्स और स्रोत

मैं एक अतिरिक्त विचार भी जोड़ूंगा जो मुझे जैक्सन और जीएसओएन की ओर वापस धकेलता है: मैंने इसे 3 जी पार्टी के बजाय एंड्रॉइड के उपयोग के लिए उपयोगी पाया है। * संकुल क्योंकि तब मैं जो कोड लिखता हूं उसे क्लाइंट और सर्वर के बीच साझा किया जा सकता है। यह JSON जैसी किसी चीज़ के लिए विशेष रूप से प्रासंगिक है, जहां आप दूसरे छोर पर भेजने के लिए एक छोर पर JSON को डेटा अनुक्रमित करना चाह सकते हैं। इस तरह के मामलों का उपयोग करने के लिए, यदि आप दोनों छोरों पर जावा का उपयोग करते हैं तो यह एंड्रॉइड को शुरू करने से बचने में मदद करता है। * निर्भरताएं।

या मुझे लगता है कि कोई भी संबंधित एंड्रॉइड को पकड़ सकता है। * स्रोत कोड और इसे अपने सर्वर प्रोजेक्ट में जोड़ें, लेकिन मैंने कोशिश नहीं की है कि ...


1

आप http://json.org (Json-lib या org.json) से लाइब्रेरी डाउनलोड कर सकते हैं और JSON को पार्स / जेनरेट करने के लिए इसका उपयोग कर सकते हैं


1

आपको बस इसे आयात करने की आवश्यकता है

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new JSONObject();

im दो ऑब्जेक्ट का उपयोग कर रहा है क्योंकि आपके पास दूसरे के भीतर एक jsonObject हो सकता है

post.put("username(here i write the key)","someusername"(here i put the value);
post.put("message","this is a sweet message");
post.put("image","http://localhost/someimage.jpg");
post.put("time":  "present time");

तो मैं इस तरह से एक और अंदर पोस्ट json डाल दिया

  param.put("post",post);

यह वह विधि है जिसका उपयोग मैं अनुरोध करने के लिए करता हूं

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

कनेक्शन सेट करना

        urlConnection = new URL("your url");
        connection = (HttpURLConnection) urlConnection.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
        connection.setReadTimeout(60000);
        connection.setConnectTimeout(60000);
        connection.connect();

आउटपुटस्ट्रीम सेट करना

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

मैं इसका उपयोग लॉगकैट में देखने के लिए करता हूं कि मैं क्या भेज रहा हूं

        Log.d("OUTPUT STREAM  " ,param);
        dataOutputStream.writeBytes(param);
        dataOutputStream.flush();
        dataOutputStream.close();

        InputStream in = new BufferedInputStream(connection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        result = new StringBuilder();
        String line;

यहाँ तार का निर्माण किया गया है

        while ((line = reader.readLine()) != null)
        {
            result.append(line);
        }

मैं इस लॉग का उपयोग यह देखने के लिए करता हूं कि प्रतिक्रिया में इसकी शुरुआत क्या है

         Log.d("INPUTSTREAM: ",result.toString());

स्ट्रिंग के साथ एक जेंस को इंस्टाल करना जिसमें सर्वर प्रतिक्रिया होती है

        jResponse=new JSONObject(result.toString());

    }
    catch (IOException e) {
        e.printStackTrace();
        return jResponse=null;
    } catch (JSONException e)
    {
        e.printStackTrace();
        return jResponse=null;
    }
    connection.disconnect();
    return jResponse;
}

आपके समय के लिए अग्रिम धन्यवाद। मैं django सर्वर पर base64 एन्कोडेड स्ट्रिंग भेजने के लिए आपके कोड का उपयोग करता हूं, लेकिन जब मैं सर्वर पर भेजने के लिए बटन क्लिक करता हूं, तो एपीपी क्रैश हो जाता है। क्या आप मुझे इससे निपटने में मदद कर सकते हैं?
नोमान ने

0

अगर आप एंड्रॉइड में फास्ट जोंस पार्सिंग की तलाश में हैं, तो मैं आपको एक उपकरण सुझाता हूं जो स्वतंत्र रूप से उपलब्ध है।

JSON वर्ग निर्माता उपकरण

यह उपयोग करने के लिए स्वतंत्र है और यह एक-दो सेकंड के भीतर आपकी सभी json पार्सिंग क्लास बना देगा ..: D


0

हालाँकि उपयोगकर्ताओं द्वारा पहले से ही उत्कृष्ट उत्तर प्रदान किए जाते हैं जैसे कि GSON आदि का उत्साहजनक उपयोग। मैं org.json के उपयोग का सुझाव देना चाहूंगा । इसमें अधिकांश GSON फ़ंक्शंस शामिल हैं। यह आपको JSONObject के तर्क के रूप में json स्ट्रिंग पास करने की भी अनुमति देता है और यह आराम का ख्याल रखेगा जैसे:

JSONObject json = new JSONObject("some random json string");

यह कार्यक्षमता इसे मेरा व्यक्तिगत पसंदीदा बनाती है।


0

अलग-अलग ओपन सोर्स लाइब्रेरी हैं, जिनका उपयोग आप पार्सिंग जोंस के लिए कर सकते हैं।

org.json: - यदि आप json को पढ़ना या लिखना चाहते हैं तो आप इस पुस्तकालय का उपयोग कर सकते हैं। सबसे पहले JsonObject बनाएं: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

अब, अपने मूल्यों को प्राप्त करने के लिए इस वस्तु का उपयोग करें: -

String id = jsonObj.getString("id");

आप यहां पूरा उदाहरण देख सकते हैं

जैक्सन डेटाबाइंड: - यदि आप अपने जोंस को विशेष रूप से POJO वर्ग में बाँधना और पार्स करना चाहते हैं, तो आप जैक्सन-डाटाइबंड लाइब्रेरी का उपयोग कर सकते हैं, यह आपके जोंस को POJO वर्ग में बाँध देगा: -

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

आप यहां पूरा उदाहरण देख सकते हैं

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