2016-02-10 4 views
2

Я использую JSON.NET для сериализации общего списка в json-файле. Он работает нормально, но я не знаю, как изменить процесс - прочитайте в 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 и rea d содержимое обратно в общий список. Единственное, что у меня до сих пор:

// 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' "

Каков правильный способ достижения этого?

+0

Вы можете показать нам фрагмент файла json? –

+0

[{«AssignmentID»: 1, «AssignmentName»: «Bible Reading»}, {«AssignmentID»: 2, «AssignmentName»: «Initial Call»}, {«AssignmentID»: 3, «AssignmentName»: «Initial Call» Householder "}, {" AssignmentID ": 4,« AssignmentName »:« Return Visit »}, {« AssignmentID »: 5,« AssignmentName »:« Return Visit Householder »}, {« AssignmentID »: 6,« AssignmentName »: «Изучение Библии»}, {«AssignmentID»: 7, «AssignmentName»: «Дом владельца Библии»}] –

ответ

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, загружаемая в память, особенно важна при работе с документами JSON размером более 85 КБ, чтобы избежать строки JSON, заканчивающейся в large object heap.

+0

Спасибо; есть ли какая-либо заслуга одного подхода над другим, или это «шесть из одной, полдюжины другой» ситуации? –