Penguraian JSON menggunakan Gson untuk Java

154

Saya ingin mem-parsing data dari JSON yang bertipe String. Saya menggunakan Google Gson .

Saya sudah:

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

dan kelas saya adalah:

public class JsonParsing{

   public void parse(String jsonLine) {

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

   }

}
Martynas
sumber

Jawaban:

241

Ini adalah kode sederhana untuk melakukannya, saya menghindari semua cek tetapi ini adalah ide utama.

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

Untuk menjadikannya lebih umum - Anda akan menemukan bahwa javadocs Gson cukup jelas dan bermanfaat.

MByD
sumber
1
JsonObject memperluas JsonElement, jadi keduanya.
MByD
lemparan baris pertama tidak dapat dipakai untuk tipe JsonParser pada versi gson-2.2.4.jar
Argumen Ilegal
3
Hasil string = jobject.get ("translationText"). ToString (); Hasil ini akan termasuk tanda kutip ganda. Hasil string = jobject.get ("translationText"). GetAsString (); tidak termasuk tanda kutip.
user1165560
Al I satu-satunya yang menganggap Gson terlalu rumit 98% dari waktu? JSONObject sederhana akan berhasil, tetapi kita semua benci mencoba / menangkap sebanyak itu?
tricknology
Saya perlu menggunakan kelas parser, namun, saya mendapatkan MalformedJsonException, jadi saya harus dapat melakukan SetLeinient dengan JsonParser. Bagaimana?
Mason Wang
111

Dalam aplikasi gson pertama saya, saya menghindari menggunakan kelas tambahan untuk menangkap nilai-nilai terutama karena saya menggunakan json untuk hal-hal konfigurasi

meskipun kurangnya informasi (bahkan halaman gson), itulah yang saya temukan dan gunakan:

mulai dari

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

Setiap kali gson melihat {}, itu membuat Peta (sebenarnya StringMap gson)

Setiap kali gson melihat '', itu menciptakan sebuah String

Setiap kali gson melihat angka, itu menciptakan Double

Setiap kali gson melihat [], itu menciptakan ArrayList

Anda dapat menggunakan fakta ini (digabungkan) untuk keuntungan Anda

Akhirnya ini adalah kode yang membuatnya

        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")
    );
Jorge Sanchez
sumber
20

Hal paling sederhana biasanya adalah membuat hierarki Objek yang cocok, seperti:

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

dan kemudian mengikat menggunakan GSON, melintasi hierarki objek melalui bidang. Menambahkan getter dan setter tidak ada gunanya untuk wadah data dasar.

Jadi sesuatu seperti:

Wrapper value = GSON.fromJSON(jsonString, Wrapper.class);
String text = value.data.translations[0].translatedText;
StaxMan
sumber
2
Maka struktur objek Anda TIDAK cocok dengan JSON.
StaxMan
8

Anda bisa menggunakan kelas terpisah untuk mewakili objek JSON dan menggunakan @SerializedNameanotasi untuk menentukan nama bidang yang akan diambil untuk setiap anggota data:

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

Kemudian Anda bisa melakukan parsing dalam metode parse () Anda menggunakan Gsonobjek:

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

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

Dengan pendekatan ini, Anda dapat menggunakan kembali Responsekelas untuk menambahkan bidang tambahan lainnya untuk mengambil anggota data lain yang mungkin ingin Anda ekstrak dari JSON - jika Anda ingin membuat perubahan untuk mendapatkan hasil, misalnya, beberapa terjemahan dalam satu panggilan, atau untuk mendapatkan string tambahan untuk bahasa sumber yang terdeteksi.

Ya ampun
sumber
7

Salah satu cara akan dibuat JsonObject dan iterasi melalui parameter. Sebagai contoh

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

Kemudian Anda dapat mengekstraksi nilai kacang seperti:

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

Semoga ini membantu.

Anand Tuli
sumber
5

Menggunakan Gson untuk Memecahkan
saya akan membuat kelas untuk parameter individu di String json. Atau Anda dapat membuat satu kelas utama yang disebut "Data" dan kemudian membuat kelas-kelas dalam yang sama. Saya membuat kelas terpisah untuk kejelasan.

Kelas adalah sebagai berikut.

  • Data
  • Terjemahan
  • Teks yang Diterjemahkan

Di kelas JsonParsing metode "parse" kita sebut gson.fromJson(jsonLine, Data.class)yang akan mengkonversi String di objek java menggunakan Refleksi.

Setelah kami memiliki akses ke objek "Data" kami dapat mengakses setiap parameter secara individual.

Tidak mendapat kesempatan untuk menguji kode ini karena saya jauh dari mesin dev saya. Tetapi ini seharusnya membantu.

Beberapa contoh dan artikel bagus.
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

Kode

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;
        }
    }
kensen john
sumber
Apakah Anda tidak membutuhkan setter pada kelas-kelas pembantu? Tidak ada yang dapat mengatur private String translatedTexttanpa melanggar kontrol akses, jadi tidak fromJSONmungkin mengaturnya dalam JVM yang belum memilih-ke refleksi menginjak-injak seluruh kontrol akses.
Mike Samuel
@Mike Samuel menembak sepenuhnya lupa tentang Setters
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")
    }

Contoh sederhana untuk mem-parse JSON seperti ini

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

Rahul Malhotra
sumber
2

Pertama Hasilkan Getter Dan Setter menggunakan situs parsing di bawah ini

http://www.jsonschema2pojo.org/

Sekarang gunakan Gson

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

Sekarang gunakan objek untuk mendapatkan nilai seperti data, translationText

Nilesh Panchal
sumber
2

Anda bisa menggunakan kueri JsonPath untuk mengekstrak nilainya. Dan dengan JsonSurfer yang didukung oleh Gson, masalah Anda dapat diselesaikan dengan hanya dua baris kode!

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

Satu kode baris:

System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());
retArdos
sumber