Home > Net >  How to deserialize from JSON file with multiple objects
How to deserialize from JSON file with multiple objects

Time:12-13

So I have this JSON file. I want to get the data out of it in C#.

{
    "Server": [
        {
            "Name": "Server1",
            "AvgTemp": 36,
            "CurTemp": 50.3,
            "MaxTemp": 41,
            "MinTemp": 37
        },
        {
            "Name": "Server2",
            "AvgTemp": 36,
            "CurTemp": 50.3,
            "MaxTemp": 41,
            "MinTemp": 41
        },
        {
            "Name": "Server3",
            "AvgTemp": 36,
            "CurTemp": 50.3,
            "MaxTemp": 41,
            "MinTemp": 36
        },
        {
            "Name": "Server4",
            "AvgTemp": 36,
            "CurTemp": 50.3,
            "MaxTemp": 41,
            "MinTemp": 41.3
        }
    ]
}

I already tried this:

public ReadJson()
{
    //prevents the threads to block each other while accessing the json file
    using (var file = new FileStream("E:\\Programming\\Timmermann00\\Betrieblicher_Auftrag\\JSON\\Values.json", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (StreamReader r = new StreamReader(file))
    {
        string json = r.ReadToEnd();
        //Testing
        List<Values> values = JsonConvert.DeserializeObject<List<Values>>(json); 
                
    }
}

public class Values : INotifyPropertyChanged
{
    public Values()
    {
            
    }

    string Name { get; set; }

    string avgTemp; 
    public string AvgTemp { get => avgTemp; set
        {
            if(avgTemp!= value)
            {
                avgTemp = value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(AvgTemp)));
            }
        }
    }

    string maxTemp; 
    public string MaxTemp { get => maxTemp; set
        {
            if(maxTemp != value)
            {
                maxTemp = value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MaxTemp)));
            }
        }
    }

    string minTemp; 
    public string MinTemp
    {
        get => minTemp; set
        {
            if (minTemp != value)
            {
                minTemp= value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MinTemp)));
            }
        }
    }

    string curTemp;
    public string CurTemp
    {
        get => curTemp; set
        {
            if (curTemp != value)
            {
                curTemp = value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurTemp)));   
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

I get an error that says that my JSON file doesn't have any arrays in it so it can't convert into a List. Error message:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Betrieblicher_Auftrag.Values]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

What is wrong?

CodePudding user response:

You need a Root class for the deserialization.

public class Root
{
    public List<Value> Server { get; set; }
}

And deserialize as Root instance.

Root root = JsonConvert.DeserializeObject<Root>(json);
List<Values> values = root.Server; 

CodePudding user response:

Working code.

can you try with this.

public ReadJson()
    {
        //prevents the threads to block each other while accessing the json file
        using (var file = new FileStream("E:\\Programming\\Timmermann00\\Betrieblicher_Auftrag\\JSON\\Values.json", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (StreamReader r = new StreamReader(file))
        {
            string json = r.ReadToEnd();
            //Testing
         var servers = JsonConvert.DeserializeObject<Server>(json);
            List<Values> values = server.Server;
            
        }
    }
}

public List<Values> Server {get; set;}
public class Values:INotifyPropertyChanged
{
    public Values()
    {
        
    }
    
    string Name { get; set; }

    string avgTemp; 
    public string AvgTemp { get => avgTemp; set
        {
            if(avgTemp!= value)
            {
                avgTemp = value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(AvgTemp)));
            }
        }
    }
    string maxTemp; 
    public string MaxTemp { get => maxTemp; set
        {
            if(maxTemp != value)
            {
                maxTemp = value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MaxTemp)));
            }
        }
    }

    string minTemp; 
    public string MinTemp
    {
        get => minTemp; set
        {
            if (minTemp != value)
            {
                minTemp= value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MinTemp)));
            }
        }
    }

    string curTemp;
    public string CurTemp
    {
        get => curTemp; set
        {
            if (curTemp != value)
            {
                curTemp = value;
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurTemp)));   
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
  • Related