java – 如何使用GSON反序列化不同对象的数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何使用GSON反序列化不同对象的数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5292字,纯文字阅读大概需要8分钟。
内容图文
![java – 如何使用GSON反序列化不同对象的数组](/upload/InfoBanner/zyjiaocheng/786/53d788f3daac4553bc514f62d35fbd23.jpg)
我收到这样的JSON
[
{
"albums" : [
{"id":"0", "name":"name"},
{"id":"1", "name":"name"}
],
"name":"name"
},
{
"tracks" : [
{"id":"0", "name":"name", "duration":"3:30"},
{"id":"1", "name":"name", "duration":"2:40"}
],
"name":"name"
},
{
"playlists" : [
{"id":"0", "name":"name", "tracksCount":"3"},
{"id":"1", "name":"name", "tracksCount":"40"}
],
"name":"name"
}
]
当然,我实现了包含所有字段和类的Track,Album和Playlist类
Tracks {
String name;
List<Track> tracks;
}
Albums {
String name;
List<Album> albums;
}
Playlists {
String name;
List<Playlist> playlists;
}
我试图用以下方法对其进行反序列化:
Gson gson = new Gson();
JsonResponse[] rez = gson.fromJson(str, JsonResponse[].class);
JsonResponse在哪里
class JsonResponse {
Albums albums;
Tracks tracks;
Playlists playlists;
}
但我得到错误:
11-20 19:24:55.210: E/AndroidRuntime(5432): FATAL EXCEPTION: main
11-20 19:24:55.210: E/AndroidRuntime(5432):
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 13 11-20
19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
11-20 19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
11-20 19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
11-20 19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
11-20 19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72)
11-20 19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.Gson.fromJson(Gson.java:803) 11-20 19:24:55.210:
E/AndroidRuntime(5432): at
com.google.gson.Gson.fromJson(Gson.java:768) 11-20 19:24:55.210:
E/AndroidRuntime(5432): at
com.google.gson.Gson.fromJson(Gson.java:717) 11-20 19:24:55.210:
E/AndroidRuntime(5432): at
com.google.gson.Gson.fromJson(Gson.java:689) 11-20 19:24:55.210:
11-20 19:24:55.210: E/AndroidRuntime(5432): at
android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43) 11-20
19:24:55.210: E/AndroidRuntime(5432): at
android.os.Handler.handleCallback(Handler.java:587) 11-20
19:24:55.210: E/AndroidRuntime(5432): at
android.os.Handler.dispatchMessage(Handler.java:92) 11-20
19:24:55.210: E/AndroidRuntime(5432): at
android.os.Looper.loop(Looper.java:130) 11-20 19:24:55.210:
E/AndroidRuntime(5432): at
android.app.ActivityThread.main(ActivityThread.java:3687) 11-20
19:24:55.210: E/AndroidRuntime(5432): at
java.lang.reflect.Method.invokeNative(Native Method) 11-20
19:24:55.210: E/AndroidRuntime(5432): at
java.lang.reflect.Method.invoke(Method.java:507) 11-20 19:24:55.210:
E/AndroidRuntime(5432): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
11-20 19:24:55.210: E/AndroidRuntime(5432): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 11-20
19:24:55.210: E/AndroidRuntime(5432): at
dalvik.system.NativeStart.main(Native Method) 11-20 19:24:55.210:
E/AndroidRuntime(5432): Caused by: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 13 11-20
19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
11-20 19:24:55.210: E/AndroidRuntime(5432): at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
11-20 19:24:55.210: E/AndroidRuntime(5432): … 21 more
附: json响应中的某些项可能会被遗漏.例如
[
{
"albums" : [
{"id":"0", "name":"name"},
{"id":"1", "name":"name"}
],
"name":"name"
}
]
那么问题是什么?如何反序列化这个JSON?
顺便说一句,我不能改变JSON.所以我需要一个解析它的代码.
解决方法:
这样做
你的数据
String json = "[{\"albums\":[{\"id\":\"0\",\"name\":\"name\"},{\"id\":\"1\",\"name\":\"name\"}],\"name\":\"name\"},{\"tracks\":[{\"id\":\"0\",\"name\":\"name\",\"duration\":\"3:30\"},{\"id\":\"1\",\"name\":\"name\",\"duration\":\"2:40\"}],\"name\":\"name\"},{\"playlists\":[{\"id\":\"0\",\"name\":\"name\",\"tracksCount\":\"3\"},{\"id\":\"1\",\"name\":\"name\",\"tracksCount\":\"40\"}],\"name\":\"name\"}]";
你的pojos
class JsonResponse {
ArrayList<Album> albums;
ArrayList<Track> tracks;
ArrayList<Playlist> playlists;
String name;
@Override
public String toString() {
return "JsonResponse [albums=" + albums + ", tracks=" + tracks
+ ", playlists=" + playlists + ", name=" + name + "]";
}
}
class Track{
int id;
String name;
String duration;
@Override
public String toString() {
return "Track [id=" + id + ", name=" + name + ", duration=" + duration
+ "]";
}
}
class Album{
int id;
String name;
@Override
public String toString() {
return "Album [id=" + id + ", name=" + name + "]";
}
}
class Playlist{
int id;
String name;
int tracksCount;
@Override
public String toString() {
return "Playlist [id=" + id + ", name=" + name + ", tracksCount="
+ tracksCount + "]";
}
}
这里是反序列化的数组.
JsonParser parser = new JsonParser();
JsonArray Jarray = parser.parse(json).getAsJsonArray();
Gson gson = new Gson();
for(JsonElement obj : Jarray )
{
JsonResponse jsonResponse = gson.fromJson( obj , JsonResponse.class);
System.out.println(jsonResponse);
}
内容总结
以上是互联网集市为您收集整理的java – 如何使用GSON反序列化不同对象的数组全部内容,希望文章能够帮你解决java – 如何使用GSON反序列化不同对象的数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。