অ্যান্ড্রয়েডে জেএসওএন অবজেক্টগুলি প্রেরণ এবং পার্সিং [বন্ধ]


137

আমি কোনও সার্ভারে JSON অবজেক্টের আকারে বার্তা প্রেরণ করতে এবং সার্ভার থেকে জেএসএন প্রতিক্রিয়া পার্স করতে চাই।

JSON অবজেক্টের উদাহরণ

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

আমি গুণাবলী দ্বারা বিশিষ্ট হয়ে JSON কে ম্যানুয়ালি পার্স করার চেষ্টা করছি। এই প্রক্রিয়াটিকে আরও সহজ করতে আমি কি কোনও লাইব্রেরি / ইউটিলিটি ব্যবহার করতে পারি?


2
এই URL টি আর উপলব্ধ নেই ... আপনি কি এটি আপডেট করতে পারবেন?
সিপি আইপি


1
@ পরেশ মায়ানী & @ প্রিম্পাপ .. আমি জানি যে আমরা জেএসএন ব্যবহার করে সার্ভার থেকে প্রাপ্ত পদ্ধতিটি ব্যবহার করে সার্ভার থেকে ডেটা পপুলেট করতে পারি, আমি এতে স্বাচ্ছন্দ্যবোধ করি .... তবে যদি আমরা সার্ভারে ডেটা প্রেরণের জন্য পোস্ট পদ্ধতি ব্যবহার করি, তবে আমরা আবার JSON হিসাবে ডেটা প্রেরণ করি, আমি প্রিম্পাপ প্রশ্নের উদ্ধৃতিটি উল্লেখ করছি "আমি জেএসওএন বস্তুর আকারে একটি জ্যাঙ্গো সার্ভারে বার্তা প্রেরণ করতে চাই" ..... আমি সার্ভারে মাইএসকিএল ব্যবহার করছি .... বা আমি JSON অবজেক্ট পাঠাচ্ছি? ... আপনি কি আমার কাছে এই তথ্যটি স্পষ্ট করে বলতে পারেন .... বা ধারণাটি বুঝতে সহায়তা করে এমন কোনও লিঙ্কগুলি সহায়ক হবে, ধন্যবাদ
দেবরথ ২

উত্তর:


118

আমি অবাক হয়েছি যেগুলির উল্লেখ করা হয়নি: তবে জেসন.আর.র.র ছোট্ট প্যাকেজটির সাথে খালি-হাড়ের পরিবর্তে ম্যানুয়াল প্রক্রিয়াটি ব্যবহার করার পরিবর্তে, জিএসন এবং জ্যাকসন ব্যবহার করতে আরও সুবিধাজনক। তাই:

সুতরাং আপনি আসলে নিজের পোজোকে আবদ্ধ করতে পারেন, কোনও অর্ধ-অ্যাসিডেড ট্রি নোড বা তালিকা এবং মানচিত্র নয়। (এবং কমপক্ষে জ্যাকসন এ জাতীয় জিনিসগুলিকেও খুব জোর করে বাঁধার অনুমতি দেয় (সম্ভবত জিএসওএনও, নিশ্চিত নয়), জসননোড, মানচিত্র, তালিকা, যদি আপনি 'সত্যিকারের' বস্তুর পরিবর্তে সত্যিই এটি চান তবে)

19-মার্চ -2017 সম্পাদনা করুন:

আরেকটি নতুন প্রতিযোগী হলেন জ্যাকসন জুনিয়র লাইব্রেরি: এটি জ্যাকসন ( jackson-core) এর মতো একই দ্রুত স্ট্রিমিং পার্সার / জেনারেটর ব্যবহার করে , তবে ডেটা-বাইন্ডিং অংশটি ক্ষুদ্র (50 কেবি)। কার্যকারিতা আরও সীমাবদ্ধ (কোনও টিকা নেই, কেবল নিয়মিত জাভা বিন), তবে কর্মক্ষমতা অনুসারে দ্রুত হওয়া উচিত, এবং প্রাথমিকভাবে (প্রথম কল) ওভারহেড খুব কম হওয়া উচিত। তাই এটি কেবল ভাল পছন্দ হতে পারে, বিশেষত ছোট অ্যাপ্লিকেশানের জন্য।


10
GSON এর জন্য +1। আমরা বিশেষ করে GSON এর স্ট্রিমিং সমর্থন ব্যবহার করেছেন sites.google.com/site/gson/streaming আমাদের অ্যান্ড্রয়েড অ্যাপ্লিকেশনে।
আন্দ্রে স্টিইংরেস

এফডাব্লুআইডাব্লু, জ্যাকসনের স্ট্রিমিং এপিআইও রয়েছে: উইকি.ফাস্টারএমএমলাল
স্ট্যাকসমান

2
জিএসওএন স্ট্রিমিংয়ের জন্যও +1। প্রবর্তিত জ্যাকসন প্রথমে স্ট্রিমিং করলেও ডিবাগ সংস্করণে কার্যকর হলেও প্রোগুয়ার্ড প্রচুর পরিমাণে ত্রুটি তৈরি করেছে এবং রিলিজ সংস্করণ ক্র্যাশ ঘটায় যা ট্র্যাকডাউন করা শক্ত। আমি নিশ্চিত এটি জ্যাকসন সম্পর্কিত কোনও সমস্যা নয়, তবে এটি আমাকে জিএসএন-এ স্যুইচ করতে বাধ্য করেছে যা সূক্ষ্মভাবে কাজ করেছে এবং কেবলমাত্র স্ট্রিমিংয়ের জন্য অতিরিক্ত 14 কেবি প্রয়োজন।
সোভেন

এবং বোকা অপ্রতিরোধ্য জেএসন মিশ্রনের স্ট্রিংগুলির জন্য এবং তালিকাটি প্রাক্তন: ["টোটো", "টাটা", ["মন্টি", ["টর", "পাইথন"]]]? (এটি
খ্রিস্টোফে

85

আপনি org.json.JSONObject এবং org.json.JSONTokener ব্যবহার করতে পারেন । আপনার কোনও বাহ্যিক গ্রন্থাগার প্রয়োজন নেই যেহেতু এই ক্লাসগুলি অ্যান্ড্রয়েড এসডিকে নিয়ে আসে


ওহো! আমি সেটা মিস করেছি. প্রকৃতপক্ষে, তারা ওয়েবসাইটটিতে org.json লাইব্রেরি।
গৌরব বৈশ

এটি আমি ব্যবহার করি এবং এটি কবজির মতো কাজ করে।
আদম

এটির উদাহরণস্বরূপ বা এর কোনও লিঙ্ক দেওয়া যেতে পারে তবে দুর্দান্ত হবে। এটি সেভাবে শেখা সহজ। :)
আদিম পাপ্পাচান


1
আরও অনেক সুবিধা, লেখার জন্য কম কোড: কয়েক ডজনের পরিবর্তে এক বা দুটি লাইন।
স্টেক্সম্যান 24

31

তথ্যগুলির একটি নির্দিষ্ট কাঠামো থাকলে জিএসওএন ব্যবহার করা সবচেয়ে সহজ এবং যাওয়ার উপায়।

গসন ডাউনলোড করুন

এটি রেফারেন্সড লাইব্রেরিতে যুক্ত করুন।

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 রূপান্তর অপ্রয়োজনীয়। এবং সেটার এবং গিটারগুলি জিএসনের জন্য ;চ্ছিক; কেউ চাইলে যোগ করা যেতে পারে, তবে কঠোরভাবে প্রয়োজনীয় নয়।
StaxMan

4
কেবল স্ট্যাক্সম্যানের মন্তব্যটি স্পষ্ট করার জন্য। আপনার উদাহরণটি জেস্ট্রিং গ্রহণ করছে, এটিকে জেএসওনোবজেক্টে রূপান্তর করছে, তারপরে এটি জিএসন পড়ার জন্য একটি স্ট্রিংয়ে ফিরিয়ে দেয়। কেবল pst = gson.fromJson (jString, Post.class) ব্যবহার করুন। আমি বিশ্বাস করি এটি চেষ্টা করার প্রয়োজনীয়তা থেকেও মুক্তি পাবে। এবং স্ট্যাক্সম্যান যেমনও উল্লেখ করে, পোস্টক্লাসে সেটার এবং গিটারগুলি কোনও মূল্য যোগ করে না। আপনার উদাহরণটি সংশোধন করা অন্যের পক্ষে সহায়ক হবে।
ম্যাট

আমি উত্তর থেকে ডাবল রূপান্তর অংশটি
সরিয়েছি

4

এটি জসনপার্সার ক্লাস

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

জেএসএন-তে আসলে কিছুই নেই। কোঁকড়ানো বন্ধনীগুলি "অবজেক্টস" (এসোসিয়েটিভ অ্যারে) এবং বর্গাকার বন্ধনীগুলি কী ছাড়াই অ্যারেগুলির জন্য হয় (সংখ্যাসূচকভাবে সূচকযুক্ত)। অ্যান্ড্রয়েডে এটির সাথে কাজ করার ক্ষেত্রে, এসডিকে অন্তর্ভুক্ত এর জন্য তৈরি ক্লাস রয়েছে (ডাউনলোডের প্রয়োজন নেই)।

এই ক্লাসগুলি দেখুন: http://developer.android.com/references/org/json/package-summary.html


আমি মনে করি আপনি কোঁকড়া-ধনুর্বন্ধনী এবং কৌণিক বন্ধনী নয়!
গৌরব বৈশ

2

অন্যান্য উত্তরে জ্যাকসন এবং জিএসওন উল্লেখ করেছে - অ্যান্ড্রয়েডের জন্য জনপ্রিয় অ্যাড অন জেএসওএন লাইব্রেরি এবং অ্যান্ড্রয়েডের অন্তর্ভুক্ত জেএসন.অর্গ, নগ্ন-হাড়ের জেএসওএন প্যাকেজ noted

তবে আমি মনে করি এটিও লক্ষণীয় যে অ্যান্ড্রয়েডের নিজস্ব নিজস্ব বৈশিষ্ট্যযুক্ত JSON API রয়েছে।

এটি হানিকম্ব: এপিআই স্তর 11 এ যুক্ত হয়েছিল।

এতে অন্তর্ভুক্ত রয়েছে
- android.util.JsonReader: ডক্স এবং উত্স
- android.util.JsonWriter: ডক্স এবং উত্স

আমি আরও একটি বিবেচনা যুক্ত করব যা আমাকে জ্যাকসন এবং জিএসন-এর দিকে ফিরিয়ে দেয়: তৃতীয় পক্ষের অ্যানড্রয়েডের পরিবর্তে তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করা আমার কাছে দরকারী বলে মনে হয়েছে। * প্যাকেজগুলি কারণ তখন আমার লেখা কোডটি ক্লায়েন্ট এবং সার্ভারের মধ্যে ভাগ করা যায়। এটি জেএসএন এর মতো কোনও কিছুর জন্য বিশেষত প্রাসঙ্গিক, যেখানে আপনি অন্য প্রান্তে প্রেরণের জন্য এক প্রান্তে জেএসএনে ডেটা সিরিয়ালাইজ করতে চাইতে পারেন। এর মতো ব্যবহারের ক্ষেত্রে, আপনি উভয় প্রান্তে জাভা ব্যবহার করলে এটি অ্যান্ড্রয়েড প্রবর্তন এড়াতে সহায়তা করে * * নির্ভরতা।

অথবা আমি অনুমান করি যে কোনও প্রাসঙ্গিক অ্যান্ড্রয়েড দখল করতে পারে * উত্স কোড এবং এটি আপনার সার্ভার প্রকল্পে যুক্ত করতে পারে, তবে আমি এটি চেষ্টা করি নি ...


1

আপনি http://json.org (জসন-লিব বা org.json) থেকে একটি লাইব্রেরি ডাউনলোড করতে পারেন এবং JSON কে পার্স / তৈরি করতে ব্যবহার করতে পারেন


1

আপনার শুধু এটি আমদানি করা দরকার

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new 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");

তারপরে আমি পোস্ট জসনকে এর মতো আরেকজনের ভিতরে রেখেছি

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

আগাম আপনার সময়ের জন্য ধন্যবাদ জাঙ্গো সার্ভারে বেস 64 এনকোডড স্ট্রিং প্রেরণের জন্য আমি আপনার কোডটি ব্যবহার করি তবে আমি সার্ভারে পাঠাতে বোতামটি ক্লিক করলে অ্যাপ্লিকেশন ক্রাশ হয়ে যায়। আপনি কীভাবে এটি মোকাবেলা করতে আমাকে সহায়তা করতে পারেন?
নোমান মারওয়াত

0

যদি আপনার অ্যান্ড্রয়েডে দ্রুত জসন পার্সিংয়ের সন্ধান হয় তবে আমি আপনাকে এমন একটি সরঞ্জাম প্রস্তাব করি যা নিখরচায় পাওয়া যায়।

JSON শ্রেণীর নির্মাতা সরঞ্জাম

এটি ব্যবহারের জন্য নিখরচায় এবং এটি আপনার সমস্ত জসন পার্সিং ক্লাসটি এক-দুই সেকেন্ডের মধ্যে তৈরি করবে ..: ডি


0

যদিও ইতিমধ্যে উত্সাহিত উত্তরগুলি ব্যবহারকারীরা যেমন জিএসওএন এর উত্সাহজনক ব্যবহার ইত্যাদির দ্বারা সরবরাহ করে থাকে আমি org.json ব্যবহারের পরামর্শ দিতে চাই । এটিতে বেশিরভাগ জিএসওএন কার্যকারিতা অন্তর্ভুক্ত রয়েছে। এটি আপনাকে JSONObject এর পক্ষে যুক্তি হিসাবে json স্ট্রিং পাশ করার অনুমতি দেয় এবং এটি বিশ্রামের যত্ন নেবে যেমন:

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

এই কার্যকারিতা এটিকে আমার ব্যক্তিগত পছন্দ করে তোলে।


0

এখানে বিভিন্ন ওপেন সোর্স লাইব্রেরি রয়েছে, যা আপনি json পার্স করার জন্য ব্যবহার করতে পারেন।

org.json: - আপনি যদি json পড়তে বা লিখতে চান তবে আপনি এই লাইব্রেরিটি ব্যবহার করতে পারেন। প্রথমে জসনঅবজেক্ট তৈরি করুন: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

এখন, আপনার মানগুলি পেতে এই অবজেক্টটি ব্যবহার করুন: -

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

আপনি এখানে সম্পূর্ণ উদাহরণ দেখতে পারেন

জ্যাকসন ডাটাবাইন্ড: - আপনি যদি নিজের জসনকে নির্দিষ্ট POJO শ্রেণিতে বাঁধতে এবং পার্স করতে চান তবে আপনি জ্যাকসন -ডাটাবাইন্ড লাইব্রেরিটি ব্যবহার করতে পারেন, এটি আপনার জসনকে POJO শ্রেণিতে আবদ্ধ করবে: -

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

আপনি এখানে সম্পূর্ণ উদাহরণ দেখতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.