Java için Gson kullanarak JSON ayrıştırma


154

Türü JSON veri ayrıştırmak istiyorum String. Google Gson kullanıyorum .

Sahibim:

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

ve benim sınıfım:

public class JsonParsing{

   public void parse(String jsonLine) {

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

   }

}

Yanıtlar:


241

Bunu yapmak için basit bir kod, tüm kontrolleri kaçındı ama bu ana fikir.

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

Kullanımı daha genel hale getirmek için - Gson'ın javadoclarının oldukça açık ve yararlı olduğunu göreceksiniz .


1
JsonObject, JsonElement'i genişletir, bu yüzden her ikisi de.
MByD

ilk satır atışları, gson-2.2.4.jar sürümünde JsonParser türünü başlatamaz
geçersiz

3
Dize sonucu = jobject.get ("tercüme edilmişText"). ToString (); Bu sonuçlar çift tırnak içerecektir. Dize sonucu = jobject.get ("tercüme edilmişText"). GetAsString (); tırnak işaretleri içermez.
user1165560

Gson'un zamanın% 98'ini karmaşık hale getirdiğini düşünen tek kişi ben miyim? Basit bir JSONObject yapardı, ama hepimiz o kadar çok denemek / yakalamaktan nefret mi ediyoruz?
tricknology

Ayrıştırıcı sınıfı kullanmanız gerekiyor, ancak Setformer JsonParser ile yapmak zorunda, bu yüzden MalformedJsonException alıyorum. Nasıl?
Mason Wang

111

İlk gson uygulamamda, değerleri yakalamak için ek sınıflar kullanmaktan kaçındım çünkü yapılandırma konuları için json kullanıyorum

bilgi eksikliğine rağmen (gson sayfası bile), bulduğum ve kullandığım şey bu:

den başlayarak

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

Gson her {} gördüğünde, bir Harita oluşturur (aslında bir gson StringMap)

Gson '' u her gördüğünde, bir String oluşturur

Gson her sayıyı gördüğünde,

Gson her [] gördüğünde, bir ArrayList oluşturur

Bu gerçekleri (birleşik) kendi yararınıza kullanabilirsiniz

Sonunda, bu şeyi yapan kod

        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

En basit şey genellikle eşleşen Nesne hiyerarşisi oluşturmaktır, şöyle:

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

ve sonra nesne üzerinden hiyerarşiyi alanlar üzerinden GSON kullanarak bağlayın. Alıcı ve ayarlayıcı eklemek, temel veri kapları için anlamsızdır.

Yani şöyle bir şey:

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

2
O zaman nesne yapınız JSON ile eşleşmiyor.
StaxMan


8

JSON nesnesini temsil etmek için ayrı bir sınıf kullanabilir ve @SerializedNameher veri üyesi için alınacak alan adını belirtmek için ek açıklamaları kullanabilirsiniz :

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

Daha sonra bir Gsonnesneyi kullanarak ayrıştırma () yönteminizde ayrıştırma yapabilirsiniz :

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

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

Bu yaklaşımla, ResponseJSON'dan ayıklamak isteyebileceğiniz diğer veri üyelerini almak için başka ek alanlar eklemek için sınıfı yeniden kullanabilirsiniz - örneğin, bir çağrıda birden fazla çeviri için sonuç almak istiyorsanız, veya algılanan kaynak dil için ek bir dize almak için.


7

Bir yol bir JsonObject oluşturulur ve parametreler arasında yineleme yapılır. Örneğin

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

Sonra fasulye değerlerini ayıklayabilirsiniz:

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

Bu yardımcı olur umarım.


5

Çözmek için Gson kullanarak json dizesinde
bireysel parametre için bir sınıf oluşturmak. Alternatif olarak, "Veri" adlı bir ana sınıf oluşturabilir ve sonra benzer şekilde iç sınıflar oluşturabilirsiniz. Açıklık için ayrı sınıflar yarattım.

Sınıflar aşağıdaki gibidir.

  • Veri
  • Çeviriler
  • TranslatedText

JsonParsing sınıfında "parse" yöntemini çağırırız gson.fromJson(jsonLine, Data.class).

"Veri" nesnesine eriştikten sonra her parametreye ayrı ayrı erişebiliriz.

Geliştirme makinemden uzakta olduğum için bu kodu test etme şansım olmadı. Ancak bu yardımcı olacaktır.

Bazı iyi örnekler ve makaleler.
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

kod

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

Bu yardımcı sınıflar için ayarlayıcılara ihtiyacınız yok mu? private String translatedTextErişim kontrolünü ihlal etmeden hiçbir şey ayarlayamaz , bu yüzden fromJSONerişim kontrolünün her yerinde çiğnemeyi yansıtan JVM'lerde ayarlayamaz.
Mike Samuel

@Mike Samuel çekimi Setters'ı tamamen unuttu
kensen john

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

Böyle bir JSON'u ayrıştırmak için basit bir örnek

{"some_array": "[\" some_element \ ": 1, \" some_more_element \ ": 2]", "some_other_element": 3}


2

Öncelikle aşağıdaki ayrıştırma sitesini kullanarak Getter ve Setter oluşturun

http://www.jsonschema2pojo.org/

Şimdi Gson'u kullanın

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

Şimdi veri, translationText gibi değerleri almak için nesneyi kullanın


2

Değeri ayıklamak için bir JsonPath sorgusu kullanabilirsiniz. Ve Gson tarafından desteklenen JsonSurfer ile probleminiz sadece iki satır kod ile çözülebilir!

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

1

Bir satır kodu:

System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.