Вытащить объект из JSON

Я делаю такой запрос getHttpResponse:

public void getHttpResponse() throws IOException {

        String url = "https://developers.lingvolive.com/api/v1/Minicard?text="+word.getText().toString()+"&srcLang=1033&dstLang=1049";


        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        Request request = new Request.Builder()
                .url(url)
                .method("GET", null)
                .addHeader("Authorization", "Bearer " + bearerToken)
                .build();

client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
                String mMessage = e.getMessage().toString();
                Log.w("failure Response", mMessage);

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String mMessage = response.body().string();
                Log.e(TAG, mMessage);

            }
        });
    }

В переменную String mMessage приходит следующий JSON:

{
    "SourceLanguage": 1033,
    "TargetLanguage": 1049,
    "Heading": "word",
    "Translation": {
        "Heading": "word",
        "Translation": "слово",
        "DictionaryName": "LingvoUniversal (En-Ru)",
        "SoundName": "word.wav",
        "Type": 1,
        "OriginalWord": ""
    },
    "SeeAlso": [
        "Word"
    ] }

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


Ответы (1 шт):

Автор решения: Andrew

Я бы советовал использовать класс модель. Это облегчит вам жизнь довольно сильно. Для этого ваш json конвертируем в класс используя например такой сервис_1 либо сервис_2.

public class wordsClass{
 private float SourceLanguage;
 private float TargetLanguage;
 private String Heading;
 Translation TranslationObject;
 ArrayList < Object > SeeAlso = new ArrayList < Object > ();


 // Getter Methods 

 public float getSourceLanguage() {
  return SourceLanguage;
 }

 public float getTargetLanguage() {
  return TargetLanguage;
 }

 public String getHeading() {
  return Heading;
 }

 public Translation getTranslation() {
  return TranslationObject;
 }

 // Setter Methods 

 public void setSourceLanguage(float SourceLanguage) {
  this.SourceLanguage = SourceLanguage;
 }

 public void setTargetLanguage(float TargetLanguage) {
  this.TargetLanguage = TargetLanguage;
 }

 public void setHeading(String Heading) {
  this.Heading = Heading;
 }

 public void setTranslation(Translation TranslationObject) {
  this.TranslationObject = TranslationObject;
 }
}
public class Translation {
 private String Heading;
 private String Translation;
 private String DictionaryName;
 private String SoundName;
 private float Type;
 private String OriginalWord;


 // Getter Methods 

 public String getHeading() {
  return Heading;
 }

 public String getTranslation() {
  return Translation;
 }

 public String getDictionaryName() {
  return DictionaryName;
 }

 public String getSoundName() {
  return SoundName;
 }

 public float getType() {
  return Type;
 }

 public String getOriginalWord() {
  return OriginalWord;
 }

 // Setter Methods 

 public void setHeading(String Heading) {
  this.Heading = Heading;
 }

 public void setTranslation(String Translation) {
  this.Translation = Translation;
 }

 public void setDictionaryName(String DictionaryName) {
  this.DictionaryName = DictionaryName;
 }

 public void setSoundName(String SoundName) {
  this.SoundName = SoundName;
 }

 public void setType(float Type) {
  this.Type = Type;
 }

 public void setOriginalWord(String OriginalWord) {
  this.OriginalWord = OriginalWord;
 }
}

и дальше десериализуем ваш json:

Gson gson = new Gson(); 
wordsClass wordsClass = gson.fromJson(json, wordsClass.class); 

Вместо json используйте приходящий к вам json. Ну и дальше уже получить данные из объекта класса будет просто я думаю через обычные геттеры. Вот аналогичный вопрос, туториал_1 и еще один вопрос.

UPDATE

Либо второй вариант, который я считаю более приемлемым. Делаем интерфейсный класс или интерфейс внутри вашей активности:

public interface apiInterface{
   @GET("your_url")
   Call<wordsClass> words();
  }

шлем запрос:

apiInterface service = retrofit.create(apiInterface.class);

       Call<wordsClass> repos = service.listRepos("machadacosta");

       repos.enqueue(new Callback<wordsClass>() {
           @Override
           public void onResponse(Call<wordsClass> call, Response<wordsClass> response) {
               Toast.makeText(getApplicationContext(), String.format("OK"), Toast.LENGTH_SHORT).show();

           }

           @Override
           public void onFailure(Call<wordsClass> call, Throwable t) {
               Toast.makeText(getApplicationContext(), String.format("KO"), Toast.LENGTH_SHORT).show();
           }

       });

И теперь ваш ответ это объект класса wordsClass. И делать с ним дальше можно что угодно и как угодно. Вот пример кода, где расписано все как красиво делать можно и вот тоже.

→ Ссылка