我正在使用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;
完成此任务的正确方法是什么?
答案 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>