Home > Mobile >  How to do deserialzation from JSON file with multiple obejcts in C#?
How to do deserialzation from JSON file with multiple obejcts in C#?

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 which says that my JSON file doesnt have any arrays in it so it cant 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