使用设计模式的JavaGSON-Json序列化程序和反序列化程序?
我正在开发桌面音乐播放器应用程序。我已经决定将所有关于歌曲、音乐播放列表等的必要信息存储在json文件中使用设计模式的JavaGSON-Json序列化程序和反序列化程序?,java,json,design-patterns,project-structure,Java,Json,Design Patterns,Project Structure,我正在开发桌面音乐播放器应用程序。我已经决定将所有关于歌曲、音乐播放列表等的必要信息存储在json文件中 public class Library { private static File libFile; private static SongList songList; private static List<Album> albumList; private static List<Artist> artistList;
public class Library {
private static File libFile;
private static SongList songList;
private static List<Album> albumList;
private static List<Artist> artistList;
private static List<Playlist> playlistList;
...
}
我有一个类库,它通常负责准备歌曲和处理json文件
public class Library {
private static File libFile;
private static SongList songList;
private static List<Album> albumList;
private static List<Artist> artistList;
private static List<Playlist> playlistList;
...
}
有两种主要方法负责处理文件:Library.load()和Library.save()。
例如,“保存方法”使用两种方法来保存相册、播放列表或艺术家收藏,如下所示:
private static <T extends SongList> JsonElement parseSongList(List<T> list) {
GsonBuilder customGsonBuilder = new GsonBuilder();
//Custom serializer for songlist (id only)
JsonSerializer <SongList> playlistSerializer = new JsonSerializer<SongList>(){
@Override
public JsonElement serialize(SongList src, Type type, JsonSerializationContext context) {
JsonArray ids = new JsonArray();
for(Song song : src.get()) {
ids.add(song.getId());
}
return ids;
};
};
//Custom serializer for albums
JsonSerializer <Album> albumSerializer = new JsonSerializer<Album>() {
@Override
public JsonElement serialize(Album src, Type type, JsonSerializationContext context) {
JsonObject result = new JsonObject();
result.addProperty("id", src.getId());
result.addProperty("artist", src.getArtist().get());
result.addProperty("release.year", src.getReleaseYear());
result.addProperty("length.in.seconds", src.getLengthInSeconds());
JsonArray ids = (JsonArray) playlistSerializer.serialize(src, type, context);
result.add("songs", ids);
return result;
}
};
//Selecting type adapter
if(!list.isEmpty()) {
SongList tmp = list.get(0);
if(tmp instanceof Playlist) {
customGsonBuilder.registerTypeAdapter(Playlist.class, playlistSerializer);
}else if(tmp instanceof Album) {
customGsonBuilder.registerTypeAdapter(Album.class, albumSerializer);
}
}else {
return null;
}
Gson customGson = customGsonBuilder.setPrettyPrinting().create();
//serializing
JsonObject songs = new JsonObject();
for(SongList songlist : list) {
songs.add(songlist.getTitle(), customGson.toJsonTree(songlist));
}
return songs;
}
私有静态JsonElement parseSongList(列表){
GsonBuilder customGsonBuilder=新的GsonBuilder();
//歌曲列表的自定义序列化程序(仅id)
JsonSerializer playlisserializer=新的JsonSerializer(){
@凌驾
公共JsonElement序列化(歌曲列表src,类型类型,JsonSerializationContext){
JsonArray id=新的JsonArray();
for(歌曲:src.get()){
add(song.getId());
}
返回ID;
};
};
//相册的自定义序列化程序
JsonSerializer albumSerializer=新的JsonSerializer(){
@凌驾
公共JsonElement序列化(相册src、类型Type、JsonSerializationContext){
JsonObject结果=新建JsonObject();
result.addProperty(“id”,src.getId());
result.addProperty(“artist”,src.getArtist().get());
result.addProperty(“release.year”,src.getReleaseYear());
addProperty(“length.in.seconds”,src.getLengthInSeconds());
JsonArray id=(JsonArray)playlisserializer.serialize(src,type,context);
结果。添加(“歌曲”,ID);
返回结果;
}
};
//选择类型适配器
如果(!list.isEmpty()){
歌曲列表tmp=list.get(0);
if(播放列表的tmp实例){
customGsonBuilder.registerTypeAdapter(Playlist.class,playlisterizer);
}else if(相册的tmp实例){
customGsonBuilder.registerTypeAdapter(Album.class,albumSerializer);
}
}否则{
返回null;
}
Gson customGson=customGsonBuilder.setPrettyPrinting().create();
//连载
JsonObject歌曲=新的JsonObject();
for(歌曲列表歌曲列表:列表){
add(songlist.getTitle(),customGson.toJsonTree(songlist));
}
返回歌曲;
}
正如你所看到的,这是混乱的(我认为),甚至不是最混乱的一个。load/save使用的每个方法都为不同的结构提供了不同的序列化程序和反序列化程序
我想在图书馆课上做“一般性清理”,这样就很容易阅读、维护,并确保如果需要,我可以轻松添加更多的音乐结构或功能
以下是我的问题:
LinkedList
——是否有任何首选的方法来序列化和反序列化这些结构,或者这并不重要?我应该为歌曲列表/专辑/艺术家或列表
提供序列化器和反序列化器吗欢迎对代码/项目结构提出任何其他建议,可能存在许多问题。如果您的代码已经运行,您应该将其发布在,但一定要先阅读它们。如果您的代码已经运行,您应该将其发布在,但一定要先阅读它们。
private static <T extends SongList> JsonElement parseSongList(List<T> list) {
GsonBuilder customGsonBuilder = new GsonBuilder();
//Custom serializer for songlist (id only)
JsonSerializer <SongList> playlistSerializer = new JsonSerializer<SongList>(){
@Override
public JsonElement serialize(SongList src, Type type, JsonSerializationContext context) {
JsonArray ids = new JsonArray();
for(Song song : src.get()) {
ids.add(song.getId());
}
return ids;
};
};
//Custom serializer for albums
JsonSerializer <Album> albumSerializer = new JsonSerializer<Album>() {
@Override
public JsonElement serialize(Album src, Type type, JsonSerializationContext context) {
JsonObject result = new JsonObject();
result.addProperty("id", src.getId());
result.addProperty("artist", src.getArtist().get());
result.addProperty("release.year", src.getReleaseYear());
result.addProperty("length.in.seconds", src.getLengthInSeconds());
JsonArray ids = (JsonArray) playlistSerializer.serialize(src, type, context);
result.add("songs", ids);
return result;
}
};
//Selecting type adapter
if(!list.isEmpty()) {
SongList tmp = list.get(0);
if(tmp instanceof Playlist) {
customGsonBuilder.registerTypeAdapter(Playlist.class, playlistSerializer);
}else if(tmp instanceof Album) {
customGsonBuilder.registerTypeAdapter(Album.class, albumSerializer);
}
}else {
return null;
}
Gson customGson = customGsonBuilder.setPrettyPrinting().create();
//serializing
JsonObject songs = new JsonObject();
for(SongList songlist : list) {
songs.add(songlist.getTitle(), customGson.toJsonTree(songlist));
}
return songs;
}