skip to Main Content

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?

2

Answers


  1. 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; 
    
    Login or Signup to reply.
  2. 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;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search