Analiza JSON folosind Gson pentru Java (Programare, Java, Json, Gson)

Martynas a intrebat.

Aș dori să parsez date din JSON care sunt de tip String.eu folosesc Google Gson.

Am:

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

și clasa mea este:

public class JsonParsing{

   public void parse(String jsonLine) {

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

   }

}

Comentarii

  • Similar: stackoverflow.com/questions/4110664/… –  > Por Vadzim.
11 răspunsuri
MByD

Acesta este un cod simplu pentru a face acest lucru, am evitat toate verificările, dar aceasta este ideea principală.

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

Pentru a face utilizarea mai generică – veți găsi că Gson’s javadocs sunt destul de clare și utile.

Comentarii

  • JsonObject extinde JsonElement, deci este ambele. –  > Por MByD.
  • prima linie aruncă nu se poate instanția de tip JsonParser pe versiunea gson-2.2.4.jar –  > Por Argument ilegal.
  • String result = jobject.get(„translatedText”).toString(); Acest rezultat va include ghilimelele duble. String result = jobject.get(„translatedText”).getAsString(); nu include ghilimelele. –  > Por user1165560.
  • Sunt singurul care crede că Gson complică prea mult lucrurile în 98% din timp? Un simplu JSONObject ar fi suficient, dar cu toții urâm atât de mult try/catch? –  > Por tricknology.
  • Am nevoie să folosesc clasa parser, însă primesc MalformedJsonException, așa că trebuie să pot face SetLeinient cu JsonParser. Cum?  > Por Mason Wang.
Jorge Sanchez

În prima mea aplicație gson am evitat să folosesc clase suplimentare pentru a prinde valoriîn principal pentru că folosesc json pentru chestiuni de configurare

în ciuda lipsei de informații (chiar și a paginii gson), asta am găsit și am folosit:

pornind de la

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

De fiecare dată când gson vede un {}, creează o Mapă (de fapt un gson StringMap )

De fiecare dată când gson vede un ”, creează un String

De fiecare dată când gson vede un număr, creează un Double

De fiecare dată când gson vede un [], creează un ArrayList

Puteți utiliza aceste fapte (combinate) în avantajul dumneavoastră

În cele din urmă, acesta este codul care face chestia

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

StaxMan

Cel mai simplu lucru este, de obicei, să se creeze o ierarhie de obiecte corespunzătoare, astfel:

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

și apoi să leagă folosind GSON, să traverseze ierarhia de obiecte prin câmpuri. Adăugarea de getters și setters este inutilă pentru containerele de date de bază.

Deci, ceva de genul:

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

Comentarii

  • Atunci structura obiectului dvs. NU se potrivește cu JSON. –  > Por StaxMan.
blue01

Puteți crea clase java corespunzătoare pentru obiectele json. Valorile de tip întreg, șir de caractere pot fi mapate ca atare. Json poate fi analizat în felul următor.

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

Iată un exemplu. http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html

rmtheis

Puteți utiliza o clasă separată pentru a reprezenta obiectul JSON și să utilizați @SerializedName adnotări pentru a specifica numele câmpului care trebuie să fie preluat pentru fiecare membru de date:

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

Apoi, puteți face analiza în metoda parse() folosind o clasă Gson obiect:

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

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

Cu această abordare, puteți refolosi clasa Response pentru a adăuga alte câmpuri suplimentare pentru a prelua alți membri de date pe care ați putea dori să îi extrageți din JSON – în cazul în care doriți să faceți modificări pentru a obține rezultate pentru, de exemplu, mai multe traduceri într-un singur apel sau pentru a obține un șir suplimentar pentru limba sursă detectată.

Anand Tuli

O modalitate ar fi crearea unui JsonObject și iterarea prin parametri. De exemplu

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

Apoi puteți extrage valori de fasole ca:

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

Sper că acest lucru vă ajută.

kensen john

Utilizarea lui Gson pentru a rezolva
Aș crea o clasă pentru parametrul individual din șirul json. Alternativ, puteți crea o clasă principală numită „Data” și apoi să creați clasele interioare în mod similar. Am creat clase separate pentru claritate.

Clasele sunt după cum urmează.

  • Data
  • Traduceri
  • TranslatedText

În clasa JsonParsing, în metoda „parse” apelăm gson.fromJson(jsonLine, Data.class) care va converti String-ul în obiecte java folosind Reflection.

Odată ce avem acces la obiectul „Data”, putem accesa fiecare parametru în parte.

Nu am avut ocazia să testez acest cod deoarece sunt departe de mașina mea de dezvoltare. Dar acest lucru ar trebui să vă ajute.

Câteva exemple și articole bune.
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

Cod

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

Comentarii

  • Nu ai nevoie de niște setteri pe aceste clase de ajutor? Nimic nu poate seta clasa private String translatedText fără să încalce controlul accesului, deci nu există nicio modalitate de fromJSON ar putea fi setate în JVM-urile care nu au optat pentru reflecție călcând în picioare controlul accesului. –  > Por Mike Samuel.
  • @Mike Samuel a uitat complet de Setters –  > Por kensen john.
Rahul Malhotra
    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")
    }

Un exemplu simplu pentru a analiza un JSON ca acesta

{ „some_array” : „[
some_element
:1,
some_more_element
:2]” , „some_other_element” : 3 }

Nilesh

În primul rând, generați getter și setter folosind site-ul de parsing de mai jos

http://www.jsonschema2pojo.org/

Acum utilizați Gson

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

Acum folosiți obiectul pentru a obține valori cum ar fi data,translationText

Leo Wang

Puteți utiliza o interogare JsonPath pentru a extrage valoarea. Și cu JsonSurfer care este susținut de Gson, problema dvs. poate fi rezolvată prin doar două linii de cod!

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

retArdos

O singură linie de cod:

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

Tags:, ,