user2307236
user2307236

Reputation: 755

Populate List with Json file

I have a List of Items. Item is an object with multiple constructors, thus an item can be created in several forms.

Example of class Item with two constructors.

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;
    }
}

I have then a Json file in the form of:-

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

I'm using the below method to read file and populate list using 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;
}

If I have only one constuctor in the Item class (example the constructor that takes 2 arguments) this method works fine and I am able to populate the list. However when I add the second constructor in class Items(since I want to be able also to read Json files with the third attribute..

Example:-

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

The ReadJsonObj method fails with error "Unable to find a constructor to use for type Item". I can fix this issue by creating multiple class Item (e.g. ItemA, ItemB),one that takes three variables and the other that takes two variables. However I would like to have only one Item class.

I cannot find out why this is happening and how to fix such an issue.

Upvotes: 0

Views: 1878

Answers (1)

Vsevolod Goloviznin
Vsevolod Goloviznin

Reputation: 12324

You can use properties instead of regular fields and constructor initialization.

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

Thus you will cover both deserialization cases.

Upvotes: 2

Related Questions