JSON জাভার জন্য জিসন ব্যবহার করে পার্সিং করছে


154

আমি তাদেরকে JSON ধরনের যা থেকে তথ্য বিশ্লেষণ করতে চাই String। আমি গুগল জিসন ব্যবহার করছি ।

আমার আছে:

jsonLine = "
{
 "data": {
  "translations": [
   {
    "translatedText": "Hello world"
   }
  ]
 }
}
";

এবং আমার ক্লাসটি হ'ল:

public class JsonParsing{

   public void parse(String jsonLine) {

      // there I would like to get String "Hello world"

   }

}

উত্তর:


241

এটি করার জন্য এটি সহজ কোড, আমি সমস্ত চেক এড়িয়ে চলেছি তবে এটি মূল ধারণা।

 public String parse(String jsonLine) {
    JsonElement jelement = new JsonParser().parse(jsonLine);
    JsonObject  jobject = jelement.getAsJsonObject();
    jobject = jobject.getAsJsonObject("data");
    JsonArray jarray = jobject.getAsJsonArray("translations");
    jobject = jarray.get(0).getAsJsonObject();
    String result = jobject.get("translatedText").getAsString();
    return result;
}

ব্যবহারটি আরও জেনেরিক করতে - আপনি দেখতে পাবেন যে গসনের জাভাদোকগুলি বেশ পরিষ্কার এবং সহায়ক।


1
জসনঅবজেক্ট জসনএলিমেন্টকে প্রসারিত করে, তাই এটি উভয়ই।
এমবিডিডি

প্রথম লাইনে নিক্ষেপ করা জেসন পার্সার প্রকারের gns-2.2.4.jar সংস্করণটি ইনস্ট্যান্ট করতে পারে না
অবৈধ যুক্তি

3
স্ট্রিং রেজাল্ট = জবজেক্ট.জেট ("ট্রান্সলেটডেক্সট")। টু স্ট্রিং (); এই ফলাফলগুলিতে ডাবল উক্তি অন্তর্ভুক্ত থাকবে। স্ট্রিং রেজাল্ট = জবজেক্ট.জেট ("ট্রান্সলেটডেক্সটেক্সট")। getAsString (); উদ্ধৃতিগুলি অন্তর্ভুক্ত করে না।
ব্যবহারকারী 1165560

কেবলমাত্র আমিই একাই মনে করি যে 98% সময়কে গসন অতিরিক্তভাবে জড়িত করে? একটি সাধারণ JSONObject করতে হবে, কিন্তু আমরা সবাই চেষ্টা / ঘৃণা করি যে এত কিছু?
ট্রিকনোলজি

আমার পার্সার ক্লাসটি ব্যবহার করা দরকার, তবে আমি ম্যালফর্মডজেসনএক্সসেপশন পাচ্ছি, তাই জসনপার্সারের সাথে আমাকে সেটলিনিয়েন্ট করতে সক্ষম হতে হবে। কিভাবে?
ম্যাসন ওয়াং

111

আমার প্রথম জিএসএন অ্যাপ্লিকেশনটিতে আমি মূল্যগুলি ধরার জন্য অতিরিক্ত ক্লাস ব্যবহার করা এড়িয়ে চলেছি মূলত কারণ আমি কনফিগার বিষয়গুলির জন্য জসন ব্যবহার করি

তথ্যের অভাব সত্ত্বেও (এমনকি জিএসএন পৃষ্ঠা), এটি আমি খুঁজে পেয়েছি এবং ব্যবহার করেছি:

থেকে শুরু করে

Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class)

প্রতিবার জিএসন একটি sees sees দেখলে এটি একটি মানচিত্র তৈরি করে (আসলে একটি জিএসন স্ট্রিংম্যাপ)

প্রতিবার জিএসন একটি '' দেখলে এটি একটি স্ট্রিং তৈরি করে

প্রতিবার জিএসন একটি সংখ্যা দেখে এটি একটি দ্বিগুণ তৈরি করে

প্রতিবার জিএসন একটি [] দেখে, এটি একটি অ্যারেলিস্ট তৈরি করে

আপনি আপনার সুবিধার্থে এই তথ্যগুলি (সম্মিলিত) ব্যবহার করতে পারেন

অবশেষে এই কোডটি এই জিনিসটি তৈরি করে

        Map<String, Object> javaRootMapObject = new Gson().fromJson(jsonLine, Map.class);

    System.out.println(
        (
            (Map)
            (
                (List)
                (
                    (Map)
                    (
                        javaRootMapObject.get("data")
                    )
                 ).get("translations")
            ).get(0)
        ).get("translatedText")
    );

20

সর্বাধিক সহজ জিনিসটি হ'ল ম্যাচিং হায়ারার্কি তৈরি করা যেমন:

public class Wrapper {
   public Data data;
}
static class Data {
   public Translation[] translations;
}
static class Translation {
   public String translatedText;
}

এবং তারপরে ক্ষেত্রগুলির মাধ্যমে জিএসওএন, ট্র্যাভার্স অবজেক্ট শ্রেণিবদ্ধ ব্যবহার করে বাঁধুন। প্রাথমিক তথ্য ধারকগুলির জন্য গিটার এবং সেটটার যুক্ত করা অর্থহীন।

সুতরাং যেমন কিছু:

Wrapper value = GSON.fromJSON(jsonString, Wrapper.class);
String text = value.data.translations[0].translatedText;

2
তারপরে আপনার অবজেক্ট স্ট্রাকচারটি JSON এর সাথে মেলে না।
স্ট্যাকসমান

14

আপনি জসন বস্তুর জন্য সংশ্লিষ্ট জাভা ক্লাস তৈরি করতে পারেন। পূর্ণসংখ্যা, স্ট্রিংয়ের মানগুলি ম্যাপ করা যায়। জেসনকে এভাবে পার্স করা যায়-

Gson gson = new GsonBuilder().create(); 
Response r = gson.fromJson(jsonString, Response.class);

এখানে একটি নিদর্শন http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html


8

আপনি JSON অবজেক্টটি উপস্থাপন করতে আলাদা ক্লাস ব্যবহার করতে পারেন @SerializedNameএবং প্রতিটি ডেটা সদস্যের জন্য দখল করতে ক্ষেত্রের নাম নির্দিষ্ট করতে টীকাগুলি ব্যবহার করতে পারেন :

public class Response {

   @SerializedName("data")
   private Data data;

   private static class Data {
      @SerializedName("translations")
      public Translation[] translations;
   }

   private static class Translation {
      @SerializedName("translatedText")
      public String translatedText;
   }

   public String getTranslatedText() {
      return data.translations[0].translatedText;
   }
}

তারপরে আপনি কোনও પદાર્થ ব্যবহার করে আপনার পার্স () পদ্ধতিতে পার্সিং করতে পারেন Gson:

Gson gson = new Gson();
Response response = gson.fromJson(jsonLine, Response.class);

System.out.println("Translated text: " + response.getTranslatedText());

এই পদ্ধতির সাহায্যে, আপনি Responseজেএসওএন থেকে যে ডেটা সদস্য খুঁজে পেতে চাইতে পারেন এমন অন্যান্য ডেটা সদস্য বাছাই করতে ক্লাসটি পুনরায় ব্যবহার করতে পারেন - আপনি যদি একটি কলে একাধিক অনুবাদ, ফলাফল বলার জন্য ফলাফল পেতে চান, বা সনাক্তকারী উত্স ভাষার জন্য একটি অতিরিক্ত স্ট্রিং পেতে।


7

একটি উপায় জাসনঅবজেক্ট তৈরি করা হবে এবং পরামিতিগুলির মাধ্যমে পুনরাবৃত্তি করা হবে। উদাহরণ স্বরূপ

JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);

তারপরে আপনি শিমের মানগুলি যেমন:

String fieldValue = jobj.get(fieldName).getAsString();
boolean fieldValue = jobj.get(fieldName).getAsBoolean();
int fieldValue = jobj.get(fieldName).getAsInt();

আশাকরি এটা সাহায্য করবে.


5

সমাধান করতে গসন ব্যবহার করে
আমি জেসন স্ট্রিংয়ের পৃথক প্যারামিটারের জন্য একটি শ্রেণি তৈরি করব। বিকল্পভাবে আপনি "ডেটা" নামে একটি প্রধান শ্রেণি তৈরি করতে পারেন এবং তারপরে একইভাবে অভ্যন্তরীণ ক্লাসগুলি তৈরি করতে পারেন। আমি স্বচ্ছতার জন্য পৃথক ক্লাস তৈরি করেছি।

ক্লাসগুলি নিম্নরূপ:

  • উপাত্ত
  • অনুবাদ
  • TranslatedText

ক্লাসে জেসন পার্সিং পদ্ধতিটি "পার্স" আমরা কল করি gson.fromJson(jsonLine, Data.class)যা স্ট্রিংটিকে জাভা অবজেক্টে প্রতিবিম্বের সাহায্যে রূপান্তর করবে।

একবার আমাদের "ডেটা" অবজেক্টে অ্যাক্সেস হয়ে গেলে আমরা প্রতিটি প্যারামিটার স্বতন্ত্রভাবে অ্যাক্সেস করতে পারি।

আমি আমার ডেভ মেশিন থেকে দূরে থাকায় এই কোডটি পরীক্ষা করার সুযোগ পাইনি। তবে এটি সাহায্য করা উচিত।

কিছু ভাল উদাহরণ এবং নিবন্ধ।
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

কোড

public class JsonParsing{

       public void parse(String jsonLine) {

           Gson gson = new GsonBuilder().create();
           Data data = gson.fromJson(jsonLine, Data.class);

           Translations translations = data.getTranslation();
           TranslatedText[] arrayTranslatedText = translations.getArrayTranslatedText(); //this returns an array, based on json string

           for(TranslatedText translatedText:arrayTranslatedText )
           {
                  System.out.println(translatedText.getArrayTranslatedText());
           }
       }

    }


    public class Data{
           private  Translations translations;
          public Translations getTranslation()
          {
             return translations;
          }

          public void setTranslation(Translations translations)
           {
                  this.translations = translations;
           }
    }

    public class Translations
    {
        private  TranslatedText[] translatedText;
         public TranslatedText[] getArrayTranslatedText()
         {
             return translatedText;
         }

           public void setTranslatedText(TranslatedText[] translatedText)
           {
                  this.translatedText= translatedText;
           }
    }

    public class TranslatedText
    {
        private String translatedText;
        public String getTranslatedText()
        {
           return translatedText;
        }

        public void setTranslatedText(String translatedText)
        {
           this.translatedText = translatedText;
        }
    }

এই সহায়ক সহায়ক ক্লাসগুলিতে আপনার কিছু সেটটার দরকার নেই? private String translatedTextঅ্যাক্সেস নিয়ন্ত্রণ লঙ্ঘন না করে কিছুই সেট করতে fromJSONপারে না, তাই JVM- এ এমন কোনও উপায় সেট করা যায় না যেগুলি অ্যাক্সেস নিয়ন্ত্রণের উপর দিয়ে প্রতিচ্ছবিটিকে পদদলিত করে না।
মাইক স্যামুয়েল

@ মাইক স্যামুয়েল সেটারগুলি সম্পর্কে সম্পূর্ণরূপে ভুলে গেছে
কেনসান জন

3
    JsonParser parser = new JsonParser();
    JsonObject jo = (JsonObject) parser.parse(data);
    JsonElement je = jo.get("some_array");

    //Parsing back the string as Array
    JsonArray ja = (JsonArray) parser.parse(o.get("some_array").getAsString());
    for (JsonElement jo : ja) {
    JsonObject j = (JsonObject) jo;
        // Your Code, Access json elements as j.get("some_element")
    }

এটির মতো কোনও জেএসএনকে পার্স করার একটি সহজ উদাহরণ

some "কিছু_আররে": "[\" কিছু_এলিমেন্ট \ ": 1, some" কিছু_মোহর_সংশ্লিষ্ট \ ": 2]", "কিছু_আর_ইলেমেন্ট": 3


2

প্রথমে পার্সিং সাইটটি ব্যবহার করে গেটর এবং সেটার তৈরি করুন

http://www.jsonschema2pojo.org/

এখন গসন ব্যবহার করুন

GettetSetterClass object=new Gson().fromjson(jsonLine,GettetSetterClass.class);

ডেটা, ট্রান্সলেশন টেক্সট এর মতো মান পেতে এখন অবজেক্টটি ব্যবহার করুন


2

মানটি বের করতে আপনি একটি জসনপথ ক্যোয়ারী ব্যবহার করতে পারেন। এবং জসনসুরফার যা গসন দ্বারা সমর্থিত, আপনার সমস্যাটি কেবল দুটি লাইন কোডের মাধ্যমে সমাধান করা যেতে পারে!

    JsonSurfer jsonSurfer = JsonSurfer.gson();
    String result = jsonSurfer.collectOne(jsonLine, String.class, "$.data.translations[0].translatedText");

1

একটি লাইন কোড:

System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.