如何正确序列化和反序列化对象数组 into/from json?

How to properly serialize and deserialize an array of objects into/from json?

我正在尝试实现一个需要存储在 .json 文件中的朋友列表,在 Kotlin/Java 和 libgdx 中,但这不是必需的(Java 很好)。 我的 (1) 代码不起作用,所以我不会将其粘贴到此处,而是尝试解释我的设计并只粘贴 (2) 的代码,因为我认为这更接近于良好的实现。

  1. 我交了个“朋友”class。添加新朋友时,主线程创建了这样一个对象,然后我将现有的“FriendsList.json”读入一个字符串,通过删除“]”并附加序列化的 Friend 对象和一个“]”来关闭字符串阵列。 我曾经并且仍然觉得这不好,所以我改变了它。
  2. 我做了一个“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);
}