如何正确序列化和反序列化对象数组 into/from json?
How to properly serialize and deserialize an array of objects into/from json?
我正在尝试实现一个需要存储在 .json 文件中的朋友列表,在 Kotlin/Java 和 libgdx 中,但这不是必需的(Java 很好)。
我的 (1) 代码不起作用,所以我不会将其粘贴到此处,而是尝试解释我的设计并只粘贴 (2) 的代码,因为我认为这更接近于良好的实现。
- 我交了个“朋友”class。添加新朋友时,主线程创建了这样一个对象,然后我将现有的“FriendsList.json”读入一个字符串,通过删除“]”并附加序列化的 Friend 对象和一个“]”来关闭字符串阵列。
我曾经并且仍然觉得这不好,所以我改变了它。
- 我做了一个“FriendArray”class,我想在其中将“Friend”对象存储在一个列表中。我认为这将使我摆脱字符串操作代码,而只序列化 FriendList class 本身,希望这也更易于阅读。问题之一是 addFriendToListOfFriends() 没有在对象中添加数据(它添加了“{}”而不是同时插入名称和 ID)。
你觉得 (2) 怎么样?你知道更好的方法吗?
(明确一点,我对设计更感兴趣,对可编译代码的兴趣不大)
import com.badlogic.gdx.files.FileHandle
import com.unciv.json.json (this is com.badlogic.gdx.utils.Json)
import java.io.Serializable
class FriendList() {
private val friendsListFileName = "FriendsList.json"
private val friendsListFileHandle = FileHandle(friendsListFileName)
private var friendListString = ""
var arrayOfFriends = FriendArray()
fun getFriendsListAsString(): String {
return friendsListFileHandle.readString()
}
fun addNewFriend(friendName: String, playerID: String) {
val friend = Friend(friendName, playerID)
arrayOfFriends.addFriendToListOfFriends(friendName, playerID)
saveFriendsList()
}
fun saveFriendsList(){
friendListString = getFriendsListAsString()
friendListString = friendListString.plus(json().prettyPrint(arrayOfFriends))
friendsListFileHandle.writeString(friendListString, false)
}
}
class Friend(val name: String, val userId: String)
class FriendArray(): Serializable {
var nrOfFriends = 0
var listOfFriends = listOf<Friend>()
fun addFriendToListOfFriends(friendName: String, playerID: String) {
var friend = Friend(friendName, playerID)
listOfFriends.plus(friend)
}
}
你真的不需要 class FriendArray。您可以将列表序列化为 JSON。此外,将现有好友列表加载到列表、将新好友添加到列表并序列化新列表更容易,而不是附加字符串。
这样您就不必担心正确的 JSON 格式或字符串操作。您只需将一个对象添加到列表,然后序列化该列表。
像这样的东西应该可以工作(在 java 中,抱歉,我对 kotlin 的了解不足以实现这个):
public void addFriendAndSerializeToFile(Friend friend) {
// load existing friend list from the file
Json json = new Json();
// here the first parameter is the List (or Collection) type and the second parameter is the type of the objects that are stored in the list
List<Friend> friendList = json.fromJson(List.class, Friend.class, friendsListFileHandle);
// add the new friend to the deserialized list
friendList.add(friend);
// serialize the whole new list to the file
String serializedFriendListWithNewFriendAdded = json.prettyPrint(friendList);
// write to the file handle
fileHandle.writeString(serializedFriendListWithNewFriendAdded, false);
}
我正在尝试实现一个需要存储在 .json 文件中的朋友列表,在 Kotlin/Java 和 libgdx 中,但这不是必需的(Java 很好)。 我的 (1) 代码不起作用,所以我不会将其粘贴到此处,而是尝试解释我的设计并只粘贴 (2) 的代码,因为我认为这更接近于良好的实现。
- 我交了个“朋友”class。添加新朋友时,主线程创建了这样一个对象,然后我将现有的“FriendsList.json”读入一个字符串,通过删除“]”并附加序列化的 Friend 对象和一个“]”来关闭字符串阵列。 我曾经并且仍然觉得这不好,所以我改变了它。
- 我做了一个“FriendArray”class,我想在其中将“Friend”对象存储在一个列表中。我认为这将使我摆脱字符串操作代码,而只序列化 FriendList class 本身,希望这也更易于阅读。问题之一是 addFriendToListOfFriends() 没有在对象中添加数据(它添加了“{}”而不是同时插入名称和 ID)。
你觉得 (2) 怎么样?你知道更好的方法吗?
(明确一点,我对设计更感兴趣,对可编译代码的兴趣不大)
import com.badlogic.gdx.files.FileHandle
import com.unciv.json.json (this is com.badlogic.gdx.utils.Json)
import java.io.Serializable
class FriendList() {
private val friendsListFileName = "FriendsList.json"
private val friendsListFileHandle = FileHandle(friendsListFileName)
private var friendListString = ""
var arrayOfFriends = FriendArray()
fun getFriendsListAsString(): String {
return friendsListFileHandle.readString()
}
fun addNewFriend(friendName: String, playerID: String) {
val friend = Friend(friendName, playerID)
arrayOfFriends.addFriendToListOfFriends(friendName, playerID)
saveFriendsList()
}
fun saveFriendsList(){
friendListString = getFriendsListAsString()
friendListString = friendListString.plus(json().prettyPrint(arrayOfFriends))
friendsListFileHandle.writeString(friendListString, false)
}
}
class Friend(val name: String, val userId: String)
class FriendArray(): Serializable {
var nrOfFriends = 0
var listOfFriends = listOf<Friend>()
fun addFriendToListOfFriends(friendName: String, playerID: String) {
var friend = Friend(friendName, playerID)
listOfFriends.plus(friend)
}
}
你真的不需要 class FriendArray。您可以将列表序列化为 JSON。此外,将现有好友列表加载到列表、将新好友添加到列表并序列化新列表更容易,而不是附加字符串。
这样您就不必担心正确的 JSON 格式或字符串操作。您只需将一个对象添加到列表,然后序列化该列表。
像这样的东西应该可以工作(在 java 中,抱歉,我对 kotlin 的了解不足以实现这个):
public void addFriendAndSerializeToFile(Friend friend) {
// load existing friend list from the file
Json json = new Json();
// here the first parameter is the List (or Collection) type and the second parameter is the type of the objects that are stored in the list
List<Friend> friendList = json.fromJson(List.class, Friend.class, friendsListFileHandle);
// add the new friend to the deserialized list
friendList.add(friend);
// serialize the whole new list to the file
String serializedFriendListWithNewFriendAdded = json.prettyPrint(friendList);
// write to the file handle
fileHandle.writeString(serializedFriendListWithNewFriendAdded, false);
}