如何将json文件反序列化回序列化的通用列表?

时间:2016-02-10 06:25:20

标签: c# generics json.net generic-list json-deserialization

我正在使用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);
}

...但是那个(不可否认的是一种疯狂的猜测)我得到了,&#34; 无法转换为&#39; System.Collections.Generic.IEnumerable&#39;到&#39;字符串&#39; &#34;

完成此任务的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

Deserialize JSON from a file,您可以将文件加载到字符串中,然后反序列化:

    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: Performance Tips

  

为了最大限度地减少内存使用量和分配的对象数量,Json.NET支持直接序列化和反序列化流。一次读取或编写JSON,而不是将整个JSON字符串加载到内存中,在处理大小超过85kb的JSON文档时尤为重要,以避免JSON字符串以large object heap结尾。 / p>