[英]How to deserialize from JSON file with multiple objects
所以我有這個 JSON 文件。 我想從 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
}
]
}
我已經嘗試過這個:
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 文件中沒有任何 arrays,因此無法轉換為列表。 錯誤信息:
無法將當前 JSON object(例如 {"name":"value"})反序列化為類型 'System.Collections.Generic.List`1[Betrieblicher_Auftrag.Values]' 因為該類型需要 JSON 數組(例如 [1,2, 3]) 正確反序列化。
怎么了?
您需要Root
class 進行反序列化。
public class Root
{
public List<Value> Server { get; set; }
}
並反序列化為Root
實例。
Root root = JsonConvert.DeserializeObject<Root>(json);
List<Values> values = root.Server;
工作代碼。
你能試試這個嗎?
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.