#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, вызывая newGsonBuilder().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(), как я его получу??