引起:java.lang.IllegalStateException:预期为 BEGIN_ARRAY,但在第 1 行第 2 列是 BEGIN_OBJECT
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28033303/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
提问by Malwinder
I am trying to parse gson response in the form of:
我正在尝试以以下形式解析 gson 响应:
{"movie_list":[
{"movie_id":"1","movie_name":"Avatar 2009"},
{"movie_id":"2","movie_name":"Titanic"}
]}
Using GSON library, like this:
使用 GSON 库,如下所示:
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
movieList = new ArrayList<MovieList>();
movieList = Arrays.asList(gson.fromJson(reader, MovieList[].class));
I have made a MovieList class:
我做了一个 MovieList 类:
public class MovieList {
公共类电影列表{
@SerializedName("movie_id")
public String movieId;
@SerializedName("movie_name")
public String movieName;
public String getMovieId() {
return movieId;
}
public void setMovieId(String movieId) {
this.movieId = movieId;
}
public String getMovieName() {
return movieName;
}
public void setMovieName(String movieName) {
this.movieName = movieName;
}
}
}
But getting this exception:
但是得到这个例外:
01-19 15:48:09.425: E/AndroidRuntime(4868): FATAL EXCEPTION: AsyncTask #1
01-19 15:48:09.425: E/AndroidRuntime(4868): Process: com.example.autocompletetextviewdemo, PID: 4868
01-19 15:48:09.425: E/AndroidRuntime(4868): java.lang.RuntimeException: An error occured while executing doInBackground()
01-19 15:48:09.425: E/AndroidRuntime(4868): at android.os.AsyncTask.done(AsyncTask.java:300)
01-19 15:48:09.425: E/AndroidRuntime(4868): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
01-19 15:48:09.425: E/AndroidRuntime(4868): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
01-19 15:48:09.425: E/AndroidRuntime(4868): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
01-19 15:48:09.425: E/AndroidRuntime(4868): at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
01-19 15:48:09.425: E/AndroidRuntime(4868): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-19 15:48:09.425: E/AndroidRuntime(4868): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-19 15:48:09.425: E/AndroidRuntime(4868): at java.lang.Thread.run(Thread.java:841)
01-19 15:48:09.425: E/AndroidRuntime(4868): Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
01-19 15:48:09.425: E/AndroidRuntime(4868): at com.google.gson.Gson.fromJson(Gson.java:815)
01-19 15:48:09.425: E/AndroidRuntime(4868): at com.google.gson.Gson.fromJson(Gson.java:741)
01-19 15:48:09.425: E/AndroidRuntime(4868): at com.example.autocompletetextviewdemo.MainActivity$AutoCompleteText.doInBackground(MainActivity.java:152)
01-19 15:48:09.425: E/AndroidRuntime(4868): at com.example.autocompletetextviewdemo.MainActivity$AutoCompleteText.doInBackground(MainActivity.java:1)
01-19 15:48:09.425: E/AndroidRuntime(4868): at android.os.AsyncTask.call(AsyncTask.java:288)
01-19 15:48:09.425: E/AndroidRuntime(4868): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-19 15:48:09.425: E/AndroidRuntime(4868): ... 4 more
01-19 15:48:09.425: E/AndroidRuntime(4868): Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
01-19 15:48:09.425: E/AndroidRuntime(4868): at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:338)
01-19 15:48:09.425: E/AndroidRuntime(4868): at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70)
01-19 15:48:09.425: E/AndroidRuntime(4868): at com.google.gson.Gson.fromJson(Gson.java:803)
回答by Greg Ennis
The root object of your JSON is an object, not an array.
JSON 的根对象是一个对象,而不是一个数组。
You need two classes here, one to represent the outer object and one to represent the movie itself:
这里需要两个类,一个表示外部对象,一个表示电影本身:
- Rename your
MovieList
class toMovie
- Create a new
Movie
class something like this:
- 将您的
MovieList
班级重命名为Movie
- 创建一个新
Movie
类,如下所示:
MovieList:
电影列表:
public class MovieList {
@SerializedName("movie_list")
public List<Movie> Movies;
}