原问题中的示例Java数据结构与注释中的JSON结构描述不匹配。
JSON 描述为
“一个 {object 数组和一个 {object}} 数组”。
就问题中描述的类型而言,转换为 Java 数据结构的 JSON 与 JSON 结构相匹配,以便使用 Gson 轻松反序列化:
“{TypeDTO 对象的数组和 {ItemDTO 对象}} 的数组”。
但问题中提供的Java数据结构不是这个。相反,它是
“{TypeDTO 对象的数组和 {ItemDTO 对象}} 数组的数组”。
二维数组!=一维数组。
第一个示例演示了使用 Gson 简单地反序列化和序列化 JSON 结构,该结构是“{object 的数组和 {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 对象}} 的数组的数组”,以匹配最初提供的 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 the slowest。据报道,Gson 的当前版本和下一个版本包括显着的性能改进,尽管我还没有寻找最新的性能测试数据来支持这些说法。
也就是说,如果 Gson 的速度足以满足您的需求,那么由于它使 JSON 反序列化变得如此简单,因此使用它可能是有意义的。如果需要更好的表现,那么杰克逊可能是更好的选择。它提供了 Gson 的许多(甚至全部)便利。
或者我是否最好坚持我已经在做的事情?
我不会。我总是宁愿有一行简单的代码,例如
TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
...轻松反序列化为复杂的数据结构,而不是一次需要三十行代码才能将各部分映射到一个组件。