Разбор 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());