Преобразование строки json в объект java?

Я искал примеры, связанные с преобразованием строк JSON в объект Java, но не нашел хороших примеров. Тот, который я нашел, когда-то был действительно простым и не имел дела со сложными строками JSON.

Я делаю приложение для перевода строк с английского на разные языки с помощью Google Translate API. Ответ Google на запрос... следующий текст отформатирован в JSON,

{"data":{"translations":[{"translatedText":"Bonjour tout le monde"}]}} 

Мой подход до сих пор заключается в использовании GSON API, однако на самом деле я застрял в том, как мне манипулировать этим сложным результатом и создавать объект Java?

Мой класс Java...

import com.google.gson.Gson;

public class JSONConverter {

private String traslatedText;

/**
 * Create an object of it self by manipulating json string
 * @param json type: String
 * @return String Translated text result from JSON responce
 */
public String getTranslation(String json){  
    Gson gson = new Gson();
    JSONConverter obj = gson.fromJson(json, JSONConverter.class);

    return obj.getTranslationForReturn();
}

/**
 * Method return a translation to a private call
 * @return String translation
 */
private String getTranslationForReturn(){
    return this.traslatedText;
 }
}

Вышеупомянутый подход не работает, так как я не получаю "Bonjour tout le monde" по возвращении,

было бы очень приятно, если бы кто-то мог расширить мое понимание.


person TeaCupApp    schedule 21.05.2011    source источник
comment
вы получаете строку json, верно? Вам также нужно будет определить свои переменные. Затем вы можете сделать что-то вроде obj.translation, чтобы получить фактический перевод. Я никогда раньше не имел дело с json в java, поэтому я действительно не знаю, как бы вы определили эту переменную. Посмотрите на пример 2 в ссылке, которую вы предоставили. Хотя строка, которая у вас есть, вложена, но я действительно не знаю, как gson будет ее анализировать.   -  person Matt    schedule 21.05.2011
comment
Этот вопрос выглядит как дубликат: stackoverflow.com/questions/1395551/   -  person Anderson Green    schedule 30.04.2013


Ответы (3)


РЕДАКТИРОВАТЬ: вам нужно, чтобы ваш класс данных Java был точной моделью JSON. Так что ваши

{"data":{"translations":[{"translatedText":"Bonjour tout le monde"}]}} 

становится:

class DataWrapper {
    public Data data;

    public static DataWrapper fromJson(String s) {
        return new Gson().fromJson(s, DataWrapper.class);
    }
    public String toString() {
        return new Gson().toJson(this);
    }
}
class Data {
    public List<Translation> translations;
}
class Translation { 
    public String translatedText;
}

По мере усложнения объектной модели код в стиле org.json становится нечитаемым, тогда как сопоставление объектов в стиле gson/jackson по-прежнему представляет собой простые объекты Java.

person Kevin    schedule 21.05.2011
comment
Если параметр — translation_text с символом подчеркивания, а innerClass iis — translationText, результатом для этой переменной будет null. Я решил это: stackoverflow.com/a/15907855/3332734 - person Francis Rodrigues; 25.02.2017
comment
Существуют аннотации Gson, когда поле json не соответствует имени поля pojo. - person Kevin; 25.02.2017
comment
Ага! @SerializeName(json_field) это способ. - person Francis Rodrigues; 25.02.2017

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

Data obj = gson.fromJson(json, Data.class);

class Data{
  public List<Data> getTranslation(){
     return translations;
  }
}

Попробуйте что-нибудь подобное. Возможно, вам придется немного поэкспериментировать.

person Matt    schedule 21.05.2011
comment
Спасибо за ответ, однако я выбираю второй ответ, чтобы он был более приемлемым, хотя ваш ответ сделал мое понимание Гсона более ясным ... ура - person TeaCupApp; 21.05.2011
comment
@krio, это нормально, но я бы согласился с ответом Кевина. gson выглядит более современным и надежным. - person Matt; 22.05.2011

Обычно я предпочитаю использовать обычную библиотеку org.json.

Используйте его как:

 // make sure the quotes are escaped
String str = "{\"data\":{\"translations\":[{\"translatedText\":\"Bonjour tout le monde\"}]}}";
 // the object data is inside a "global" JSONObject
data = new JSONObject(str).getJSONObject("data");
// get a JSONArray from inside an object
JSONArray translations = data.getJSONArray("translations");
// get the first JSONObject from the array
JSONObject text = translations.getJSONObject(0);
// get the String contained in the object -> logs Bonjour tout le monde
Log.d("***>Text", text.getString("translatedText"));

Может быть, так много кода менее понятно, чем мне бы хотелось. Это функция, как я бы это сделал:

public String getTranslation(String json){  
  JSONObject data = new JSONObject(json).getJSONObject("data");
  return data.getJSONArray("translations").getJSONObject(0).getString("translatedText");
}
person Aleadam    schedule 21.05.2011
comment
Приятно знать простой и новый метод! Спасибо - person TeaCupApp; 21.05.2011
comment
Это супер старая школа, и никто больше не использует эту библиотеку в реальном мире. Довольно забавно, что это было отмечено как правильный ответ. - person Kevin; 21.05.2011
comment
@Kevin для такой простой задачи, я все еще считаю это лучшим подходом. Всего 2 LOC и вы получите свой результат. Вам нужно было определить 3 класса, чтобы получить тот же результат с Gson. Не стану отрицать его преимуществ в других ситуациях, но здесь я их не вижу.\ - person Aleadam; 21.05.2011
comment
Это верно, Aleadam, но что происходит, когда вам действительно нужны эти дополнительные вещи. Кроме того, это делает его чище и легче для чтения, а также для обновления. Java — это все о объектно-ориентированном программировании, нет? - person Matt; 22.05.2011
comment
я использую то же самое во всем своем приложении. каково наше мнение парсинг JSON или ОБЪЕКТНОЕ МОДЕЛИРОВАНИЕ - person Killer; 29.09.2016