Как я могу десериализовать файл 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 в кучу больших объектов.

Другие вопросы по тегам