Разбор JSON с использованием Gson для Java

Я хотел бы проанализировать данные из JSON, которые имеют тип String. Я использую Google Gson.

У меня есть:

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

и мой класс:

public class JsonParsing{

   public void parse(String jsonLine) {

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

   }

}

Ответ 1

Это простой код для этого, я избегал всех проверок, но это основная идея.

 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").toString();
    return result;
}

Чтобы сделать использование более универсальным - вы обнаружите, что Gson javadocs довольно понятны и полезны.

Ответ 2

В моем первом приложении gson я избегал использования дополнительных классов для определения значений главным образом потому, что я использую json для вопросов конфигурации

несмотря на отсутствие информации (даже страницы gson), что я нашел и использовал:

начиная с

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

Каждый раз, когда gson видит {}, он создает карту (на самом деле gson StringMap)

Каждый раз, когда gson видит '', он создает строку

Каждый раз, когда gson видит число, он создает Double

Каждый раз, когда gson видит [], он создает ArrayList

Вы можете использовать эти факты (в сочетании) в своих интересах

Наконец, это код, который делает вещь

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

Ответ 3

Простейшей задачей обычно является создание соответствующей иерархии объектов, например:

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

а затем привязать с помощью GSON, пройти иерархию объектов через поля. Добавление геттеров и сеттеров бессмысленно для базовых контейнеров данных.

Так что-то вроде:

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

Ответ 4

Вы можете создать соответствующие классы java для json-объектов. Целое число, строковые значения могут быть отображены как есть. Json может быть проанализирован следующим образом:

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

Ответ 5

Использование Gson для решения
Я бы создал класс для отдельного параметра в json String. В качестве альтернативы вы можете создать один основной класс под названием "Данные", а затем создать внутренние классы аналогичным образом. Для ясности я создал отдельные классы.

Классы следующие.

  • Данные
  • Переводы
  • TranslatedText

В классе JsonParsing метод "parse" мы вызываем gson.fromJson(jsonLine, Data.class), который преобразует String в java-объекты с помощью Reflection.

Как только у нас есть доступ к объекту "Данные", мы можем получить доступ к каждому параметру индивидуально.

У меня не было возможности проверить этот код, поскольку я ухожу от своей машины dev. Но это должно помочь.

Несколько хороших примеров и статей.
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;
        }
    }

Ответ 6

Вы можете использовать отдельный класс для представления объекта 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;
   }
}

Затем вы можете выполнить синтаксический анализ в методе parse() с помощью объекта Gson:

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

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

При таком подходе вы можете повторно использовать класс Response, чтобы добавить любые другие дополнительные поля для сбора других данных, которые вы, возможно, захотите извлечь из JSON, - если вы хотите внести изменения, чтобы получить результаты, скажем, несколько переводов в одном вызове или получение дополнительной строки для обнаруженного исходного языка.

Ответ 7

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

Простой пример для анализа JSON, подобного этому

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

Ответ 8

Вы можете использовать запрос JsonPath для извлечения значения. И JsonSurfer, который поддерживается Gson, ваша проблема может быть решена просто двумя строками кода.

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

Ответ 9

Сначала создайте Getter And Setter, используя следующий сайт для анализа

http://www.jsonschema2pojo.org/

Теперь используйте Gson

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

Теперь используйте объект для получения таких значений, как data, translationText

Ответ 10

Один код строки:

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