Разбор 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"
}
}
11 ответов:
Это простой код, чтобы сделать это, я избегал всех проверок, но это основная идея.
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; }
чтобы сделать использование более общим - вы найдете, что Дсын по документации довольно ясно и полезно.
в моем первом приложении gson я избегал использования дополнительных классов для перехвата значений в основном потому, что я использую json для config matters
несмотря на отсутствие информации (даже страница gson), это то, что я нашел и использовал:
начиная от
Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class)
каждый раз, когда gson видит {}, он создает карту (фактически Gson StringMap )
каждый раз, когда gson видит", он создает строку
каждый раз, когда gson видит число, он создает Двойной
каждый раз, когда 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") );
обычно проще всего создать соответствующую иерархию объектов, например:
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;
вы можете создать соответствующие классы 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
вы можете использовать отдельный класс для представления объекта 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 для решения
Я бы создал класс для отдельного параметра в строке json. В качестве альтернативы вы можете создать один основной класс под названием "данные", а затем создать внутренние классы аналогично. Я создал отдельные классы для ясности.классы.
- данные
- перевод
- TranslatedText
в классе JsonParsing метод "parse" мы называем
gson.fromJson(jsonLine, Data.class)
что преобразует строку в объекты java с помощью отражения.Как только у нас есть доступ к объекту "данные", мы можем получить доступ к каждому параметру по отдельности.
не удалось проверить этот код, поскольку я нахожусь вдали от своей машины dev. Но это должно помочь.
некоторые хорошие примеры и articles.
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; } }
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 }
во-первых генерировать геттер и сеттер с помощью ниже разбора сайта
http://www.jsonschema2pojo.org/
теперь используйте Gson
GettetSetterClass object=new Gson().fromjson(jsonLine,GettetSetterClass.class);
теперь используйте объект для получения таких значений,как data, translationText
вы можете использовать запрос JsonPath для извлечения значения. И с JsonSurfer который поддерживается Gson, ваша проблема может быть решена просто две строки кода!
JsonSurfer jsonSurfer = JsonSurfer.gson(); String result = jsonSurfer.collectOne(jsonLine, String.class, "$.data.translations[0].translatedText");
одна строка кода:
System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());
одним из способов будет создан JsonObject и повторение параметров. Например
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();
надеюсь, что это помогает.