Как десериализовать файл JSON с несколькими объектами

Итак, у меня есть этот файл JSON. Я хочу получить данные из него на С#.

{
    "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
        }
    ]
}

Я уже пробовал это:

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

Я получаю сообщение об ошибке, в котором говорится, что в моем файле JSON нет массивов, поэтому он не может быть преобразован в список. Сообщение об ошибке:

Невозможно десериализовать текущий объект JSON (например, {"name":"value"}) в тип System.Collections.Generic.List`1[Betrieblicher_Auftrag.Values]", поскольку для этого типа требуется массив JSON (например, [1,2, 3]) для правильной десериализации.

Что не так?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен класс Root для десериализации.

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

И десериализовать как экземпляр Root.

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

Спасибо за быструю помощь. Это сработало. Можете ли вы объяснить мне, в чем точная разница между вашим «корневым» классом и моим способом преобразования его непосредственно в список?

Tim Harbeck 12.12.2022 15:29

Потому что ваш JSON — это объект, который содержит свойство, содержащее массив с типом List<Values>. Вы должны сначала десериализовать JSON как объект Root, а затем получить массив.

Yong Shun 13.12.2022 02:27

Рабочий код.

можешь попробовать с этим.

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

Другие вопросы по теме