Итак, у меня есть этот файл 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]) для правильной десериализации.
Что не так?





Вам нужен класс Root для десериализации.
public class Root
{
public List<Value> Server { get; set; }
}
И десериализовать как экземпляр Root.
Root root = JsonConvert.DeserializeObject<Root>(json);
List<Values> values = root.Server;
Потому что ваш JSON — это объект, который содержит свойство, содержащее массив с типом List<Values>. Вы должны сначала десериализовать JSON как объект Root, а затем получить массив.
Рабочий код.
можешь попробовать с этим.
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;
}
Спасибо за быструю помощь. Это сработало. Можете ли вы объяснить мне, в чем точная разница между вашим «корневым» классом и моим способом преобразования его непосредственно в список?