Как я могу десериализовать файл json обратно в общий список, из которого он был сериализован?
Я использую 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' в 'string'"
Как правильно это сделать?
1 ответ
Из десериализации 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 поддерживает сериализацию и десериализацию непосредственно в поток. Чтение или запись фрагмента JSON за раз, вместо загрузки всей строки JSON в память, особенно важно при работе с документами JSON размером более 85 КБ, чтобы избежать попадания строки JSON в кучу больших объектов.