我正在使用 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,可以将文件加载到字符串中,然后反序列化:
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 字符串最终进入大型对象堆,这一点尤其重要。