2014-11-28 1 views
0

У меня есть список предметов. Элемент - это объект с несколькими конструкторами, поэтому элемент может быть создан в нескольких формах.Список населенных пунктов с файлом Json

Пример класса Предмет с двумя конструкторами.

public class Item 
{ 
    public string name = ""; 
    public int age= 0; 
    public int anotherNumber = 0; 

    public Item(string iName, int iAge) 
    { 
     name = iName; 
     age= iAge; 
    } 

    public Item(string iName, int iAge, int iAnotherNumber) 
    { 
     name = iName; 
     age= iAge; 
    } 
} 

У меня есть то файл JSON в виде: -

[{"name":"Joseph","age":25},{"name":"Peter","age":50}] 

Я использую метод ниже, чтобы прочитать файл и заполнить список, используя Newtonsoft.Json API.

public List<Item> ReadJsonString() 
{ 
    List<Item> data = new List<Item>(); 
    string json = File.ReadAllText("\\path"); 

    data = JsonConvert.DeserializeObject<List<Item>>(json); 
    return data; 
} 

Если у меня есть только один constuctor в классе позиции (например, конструктор, который принимает 2 аргумента) этот метод работает отлично, и я могу заполнить список. Однако, когда я добавить второй конструктор в классе предметов (так как я хочу, чтобы иметь возможность также читать JSon файлы с третьим атрибутом ..

Пример: -

[{"name":"Joseph","age":25, "anotherNumber": 12},{"name":"Peter","age":50, "anotherNumber": 12}] 

Метод ReadJsonObj с ошибкой " Не удалось найти конструктор для типа Item. » Я могу исправить эту проблему, создав несколько элементов класса (например, ItemA, ItemB), один из которых принимает три переменные, а другой - две переменные. Однако я хотел бы иметь только один класс предмета.

Я не могу понять, почему это происходит и как исправить такой вопрос.

ответ

2

Вы можете использовать properties вместо обычных полей и инициализации конструктора.

public class Item 
{ 
    public string name {get;set;} 
    public int age {get;set;} 
    public int anotherNumber {get;set;} 
} 

Таким образом, вы покроете оба случая десериализации.

+0

Хорошо, но я также охватываю оба случая десериализации с помощью двух конструкторов? – user2307236

+1

@ user2307236 при таком подходе вам вообще не нужны конструкторы. Свойства, которые не будут десериализоваться, получат значения по умолчанию (пустая строка для строки и 0 для int) –

Смежные вопросы