我正在尝试使用Gson反序列化从我的webservice
返回的json字符串结构将以TypeDTO[]
返回。
TypeDTO
就像
int id;
String name;
ArrayList<ItemDTO> items[]
和ItemDTO就像
int id;
String name;
Boolean valid;
当我按如下方式调用代码时
Gson gson = new Gson();
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class);
对象内的所有内容都为null
但是,如果我使用
JSONArray
和JSONObject
将它们从org.json jar中逐个拉出来,它工作正常并且字段会相应地填充。
关于我做错了什么的任何想法? Gson非常快吗? 或者我最好坚持我已经工作的东西?
谢谢, 大卫
答案 0 :(得分:113)
原始问题中的示例Java数据结构与注释中JSON结构的描述不匹配。
JSON被描述为
“{object with a array of {object}}”的数组。
就问题中描述的类型而言,将JSON转换为与JSON结构匹配的Java数据结构,以便与Gson轻松反序列化
“{TypeDTO对象的数组,其数组为{ItemDTO object}}”。
但问题中提供的Java数据结构不是这个。相反,它是
“一个{TypeDTO对象的数组,其数组的数组为{ItemDTO object}}”。
二维数组!=一维数组。
第一个示例演示如何使用Gson简单地反序列化和序列化JSON结构,该结构是“具有{object}}数组的对象的数组”。
input.json内容:
[
{
"id":1,
"name":"name1",
"items":
[
{"id":2,"name":"name2","valid":true},
{"id":3,"name":"name3","valid":false},
{"id":4,"name":"name4","valid":true}
]
},
{
"id":5,
"name":"name5",
"items":
[
{"id":6,"name":"name6","valid":true},
{"id":7,"name":"name7","valid":false}
]
},
{
"id":8,
"name":"name8",
"items":
[
{"id":9,"name":"name9","valid":true},
{"id":10,"name":"name10","valid":false},
{"id":11,"name":"name11","valid":false},
{"id":12,"name":"name12","valid":true}
]
}
]
<强> Foo.java:强>
import java.io.FileReader;
import java.util.ArrayList;
import com.google.gson.Gson;
public class Foo
{
public static void main(String[] args) throws Exception
{
Gson gson = new Gson();
TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
System.out.println(gson.toJson(myTypes));
}
}
class TypeDTO
{
int id;
String name;
ArrayList<ItemDTO> items;
}
class ItemDTO
{
int id;
String name;
Boolean valid;
}
第二个示例使用的是一个JSON结构,它实际上是一个{TypeDTO对象的数组,其数组的数组为{ItemDTO object}}“,以匹配最初提供的Java数据结构。
input.json内容:
[
{
"id":1,
"name":"name1",
"items":
[
[
{"id":2,"name":"name2","valid":true},
{"id":3,"name":"name3","valid":false}
],
[
{"id":4,"name":"name4","valid":true}
]
]
},
{
"id":5,
"name":"name5",
"items":
[
[
{"id":6,"name":"name6","valid":true}
],
[
{"id":7,"name":"name7","valid":false}
]
]
},
{
"id":8,
"name":"name8",
"items":
[
[
{"id":9,"name":"name9","valid":true},
{"id":10,"name":"name10","valid":false}
],
[
{"id":11,"name":"name11","valid":false},
{"id":12,"name":"name12","valid":true}
]
]
}
]
<强> Foo.java:强>
import java.io.FileReader;
import java.util.ArrayList;
import com.google.gson.Gson;
public class Foo
{
public static void main(String[] args) throws Exception
{
Gson gson = new Gson();
TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
System.out.println(gson.toJson(myTypes));
}
}
class TypeDTO
{
int id;
String name;
ArrayList<ItemDTO> items[];
}
class ItemDTO
{
int id;
String name;
Boolean valid;
}
关于其余两个问题:
Gson非常快吗?
未与其他反序列化/序列化API进行比较。 Gson传统上是amongst slowest。据报道,Gson的当前和下一版本都包括显着的性能改进,但我没有寻找最新的性能测试数据来支持这些声明。
也就是说,如果Gson的速度足以满足您的需求,那么由于它使JSON反序列化变得如此简单,因此使用它可能是有意义的。如果需要更好的性能,那么杰克逊可能是更好的选择。它提供了很多(甚至可能是所有)Gson的便利。
或者我最好坚持已经完成的工作?
我不会。我总是宁愿有一行简单的代码,比如
TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
...可以轻松地反序列化为复杂的数据结构,而不是一次将一个组件映射到一个组件所需的三十行代码。
答案 1 :(得分:0)
如果您的JSON数据以数组对象开头,请使用这样的bean类。它会帮助你。
Users[] bean = gson.fromJson(response,Users[].class);
用户是我的bean类。
响应是我的JSON数据。