Как разобрать вложенный массив через GSON

#android #json

#Android #json

Вопрос:

Я хочу проанализировать ответ JSON через GSON в Android, например

  {
  "adult": false,
  "budget": 63000000,
  "spoken_languages": [
    {
      "iso_639_1": "en",
      "name": "English"
    }
  ],
}     
 

первый класс для этого

 public Detail parseDetailResponse(InputStream json) {
Gson gson = new Gson();
Reader reader=new InputStreamReader(json);
Detail handle = gson.fromJson(reader, Detail.class);
return handle;

}
 

класс для синтаксического анализа этого

 public class Detail implements Serializable{
private static final long serialVersionUID = -6814886315783830255L;

@SerializedName("adult")
public boolean Adu<
    @SerializedName("spoken_languages")
public lang[] Languages;
   }
 

Мой урок английского языка

 public class lang implements Serializable{
private static final long serialVersionUID = -6814886315783830255L;
@SerializedName("name")
public String Name;
}
 

теперь я хочу, чтобы значение lang.name , но это дает исключение нулевого указателя.. пожалуйста, помогите, как я получаю это значение…

Комментарии:

1. это ваш полный JSON или просто запись?

Ответ №1:

Попробуйте это, хотя это и не очень элегантный способ. Но, по крайней мере, это помогает добиться цели.

Проблема вашего предыдущего кода заключается в том, что GSON считал spoken_languages строку JSON массивом, поэтому вам нужно создать что-то вроде массива, который будет отражен. Здесь я выбираю ArrayList. Надеюсь, что ваша проблема может быть решена.

 import com.google.gson.GsonBuilder;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class SimpleTest {
    public static void main(String[] args) {
        String json = "{n"  
                "  "adult": false,n"  
                "  "budget": 63000000,n"  
                "  "spoken_languages": [n"  
                "    {n"  
                "      "iso_639_1": "en",n"  
                "      "name": "English"n"  
                "    }n"  
                "  ]n"  
                "}     ";

        System.out.println(new SimpleTest().parseDetailResponse(new ByteArrayInputStream(json.getBytes())));
    }

    public Detail parseDetailResponse(InputStream json) {
        return new GsonBuilder().create().fromJson(new InputStreamReader(json), Detail.class);
    }

    class Detail {
        private boolean adu<
        private long budget;
        private ArrayList<SpokenLanguages> spoken_languages;

        public Detail() {

        }

        @Override
        public String toString() {
            return "DAO{"  
                    "adult="   adult  
                    ", budget="   budget  
                    ", spoken_languages="   spoken_languages  
                    '}';
        }

        public boolean isAdult() {
            return adu<
        }

        public void setAdult(boolean adult) {
            this.adult = adu<
        }

        public long getBudget() {
            return budget;
        }

        public void setBudget(long budget) {
            this.budget = budget;
        }

        public List<SpokenLanguages> getSpoken_languages() {
            return spoken_languages;
        }

        public void setSpoken_languages(ArrayList<SpokenLanguages> spoken_languages) {
            this.spoken_languages = spoken_languages;
        }
    }

    class SpokenLanguages {
        private String name;
        private String iso_639_1;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getIso_639_1() {
            return iso_639_1;
        }

        public void setIso_639_1(String iso_639_1) {
            this.iso_639_1 = iso_639_1;
        }

        @Override
        public String toString() {
            return "SpokenLanguages{"  
                    "name='"   name   '''  
                    ", iso_639_1='"   iso_639_1   '''  
                    '}';
        }
    }
}
 

Комментарии:

1. @lzzy Leung спасибо за ваш ответ… но, сэр, что такое оператор return в методе main вашего самого простого класса, например, в моем коде я возвращаю объект класса Detail??

2. @dheeraj92 Ха, возвращаемое значение в этом операторе равно a String . Он отражает объект из строки JSON, вызывая new GsonBuilder().create().fromJson(json, DAO.class) , а затем я вызываю toString() метод объекта, который выдает строку, представляющую его. Я звоню System.out.println() , чтобы показать, что GSON успешно отразил объект.

3. @lzzy Leung вы создали метод toString в соответствующем классе и печатаете значение, но я хочу, чтобы это значение было в другом классе… и если возвращаемое значение является строкой, то как я получу эти значения… пожалуйста, напишите модифицированный метод parseDetailResponse(), который упоминается в моем вопросе??

4. @dheeraj92 Готово! 😉 Теперь, пожалуйста, обратитесь к отредактированному коду. Я надеюсь, в вашем случае это должно работать нормально.

5. @lzzy Leung спасибо, сэр, Detail.getAdult() и Detail.getBudget() дают значение, но теперь мне нужно единственное значение «name» SpokenLanguage(), как я его получу??