Пример структуры данных Java в исходном вопросе не соответствует описанию структуры JSON в комментарии.
JSON описывается как
"массив {объект с массивом {объект}}".
С точки зрения типов, описанных в вопросе, JSON, переведенный в структуру данных Java, которая будет соответствовать структуре JSON для легкой десериализации с помощью Gson, составляет
"массив объекта {TypeDTO с массивом объекта {ItemDTO}}".
Но структура данных Java, представленная в вопросе, не такова. Вместо этого это
"массив {объекта TypeDTO с массивом массива {объекта ItemDTO}}".
Двумерный массив! = Одномерный массив.
Этот первый пример демонстрирует использование Gson для простой десериализации и сериализации структуры JSON, которая представляет собой «массив {объект с массивом {объект}}».
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 традиционно был среди самым медленным . Текущий и последующие выпуски Gson, как сообщается, включают значительные улучшения производительности, хотя я не искал последних данных о тестировании производительности, чтобы поддержать эти утверждения.
Тем не менее, если Gson достаточно быстр для ваших нужд, то, поскольку это делает десериализацию JSON настолько легкой, вероятно, имеет смысл использовать ее. Если требуется лучшая производительность, то лучше использовать Джексона. Он предлагает много (возможно, даже все) удобств Gson.
Или мне лучше придерживаться того, что у меня уже работает?
Я бы не стал. Я бы предпочел иметь одну простую строку кода, такую как
TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
... чтобы легко десериализовать в сложную структуру данных, чем тридцать строк кода, которые в противном случае потребовались бы для отображения частей вместе по одному компоненту за один раз.