[英]How to deserialize from JSON file with multiple objects
So I have this JSON file.所以我有这个 JSON 文件。 I want to get the data out of it in C#.我想从 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.我收到一条错误消息,指出我的 JSON 文件中没有任何 arrays,因此无法转换为列表。 Error message:错误信息:
Cannot deserialize the current JSON object (eg {"name":"value"}) into type 'System.Collections.Generic.List`1[Betrieblicher_Auftrag.Values]' because the type requires a JSON array (eg [1,2,3]) to deserialize correctly.无法将当前 JSON object(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[Betrieblicher_Auftrag.Values]' 因为该类型需要 JSON 数组(例如 [1,2, 3]) 正确反序列化。
What is wrong?怎么了?
You need a Root
class for the deserialization.您需要Root
class 进行反序列化。
public class Root
{
public List<Value> Server { get; set; }
}
And deserialize as Root
instance.并反序列化为Root
实例。
Root root = JsonConvert.DeserializeObject<Root>(json);
List<Values> values = root.Server;
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.