如何将 json 文件反序列化回序列化它的泛型列表

本文关键字:序列化 泛型 列表 反序列化 json 文件 | 更新日期: 2023-09-27 18:33:55

我正在使用 JSON.NET 将泛型列表序列化为json文件。它工作正常,但我不知道如何逆转该过程 - 在 json 文件中读取并用其内容膨胀通用列表。

我有一个非常简单的课程:

public class AssignmentTypesLU
{
    public int AssignmentID { get; set; }
    public string AssignmentName { get; set; }
}

。以及用于保存其实例的通用列表:

List<AssignmentTypesLU> assignmentTypesList;

然后,如果文件尚不存在,我将填充通用列表(理论上,条件仅为真一次):

if (!System.IO.File.Exists(ASSIGNMENT_TYPES_FILENAME))
{
    List<AssignmentTypesLU> atluList = new List<AssignmentTypesLU>();
    AssignmentTypesLU atlu = new AssignmentTypesLU();
    atlu.AssignmentID = 1;
    atlu.AssignmentName = "Bible Reading";
    atluList.Add(atlu);
    atlu = new AssignmentTypesLU();
    atlu.AssignmentID = 2;
    atlu.AssignmentName = "Initial Call";
    atluList.Add(atlu);
    . . .
    // Serialize contents of list to json file
    var jsonAssignmentTypesLU = JsonConvert.SerializeObject(atluList);
    System.IO.File.WriteAllText(ASSIGNMENT_TYPES_FILENAME, jsonAssignmentTypesLU);
}

但是我随后想打开 json 文件并将内容读回通用列表。到目前为止,我唯一得到的是:

// Now open these files and read their contents into the lists declared above.
if (System.IO.File.Exists(ASSIGNMENT_TYPES_FILENAME))
{
    var jsonContents = System.IO.File.ReadLines(ASSIGNMENT_TYPES_FILENAME);
    assignmentTypesList = JsonConvert.DeserializeObject<List<AssignmentTypesLU>>(jsonContents);
}

。但是有了这个(诚然有点疯狂的猜测),我得到,"无法从'System.Collections.Generic.IEnumerable'转换为'字符串'"

实现此目的的正确方法是什么?

如何将 json 文件反序列化回序列化它的泛型列表

从反序列化文件中的 JSON,可以将文件加载到字符串中,然后反序列化:

    var jsonContents = System.IO.File.ReadAllText(ASSIGNMENT_TYPES_FILENAME);
    assignmentTypesList = JsonConvert.DeserializeObject<List<AssignmentTypesLU>>(jsonContents);

或者直接从流中反序列化:

    using (var reader = System.IO.File.OpenText(ASSIGNMENT_TYPES_FILENAME))
    using (var jsonReader = new JsonTextReader(reader))
    {
        var serializer = JsonSerializer.CreateDefault();
        assignmentTypesList = serializer.Deserialize<List<AssignmentTypesLU>>(jsonReader);
    }

File.ReadLines()返回一个IEnumerable<string>。 没有Deserialize重载来反序列化可枚举的字符串。

对于大文件,直接流式传输的性能会更高。 来自 Json.NET:性能提示

为了最大程度地减少内存使用量和分配的对象数,Json.NET 支持直接对流进行序列化和反序列化。在处理大小大于 85kb 的 JSON 文档时,一次读取或写入一段 JSON,而不是将整个 JSON 字符串加载到内存中,以避免 JSON 字符串最终进入大型对象堆,这一点尤其重要。