c# 将 JSON 反序列化为 3 类
c# Deserialize JSON to 3 classes
我在这个问题上花了2天时间还是没有解决这个问题...
Json 来自 Firebase 实时数据库。
我的绝对目标是在 class 中获取密钥 (Zaptec) 作为名称,而不是必须创建一个“名称”属性。但这是我改天再问的问题。
我的输出:
姓名=我的监视列表
股票=Models.StocksModel(但值为空)
{
"name": "My Watchlist",
"stocks": {
"Zaptec": {
"avgPrice": "2,14",
"name": "Zaptec",
"shares": 121
}
}
}
public class WatchlistModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
private StocksModel _stocks;
public StocksModel Stocks
{
get { return _stocks; }
set { _stocks = value; OnPropertyChanged("Stocks"); }
}
}
public class StocksModel : INotifyPropertyChanged
{
private StockModel _stocks;
public StockModel Stocks
{
get { return _stocks; }
set { _stocks = value; OnPropertyChanged("Stocks"); }
}
}
public class StockModel : INotifyPropertyChanged
{
#region -- Properties --
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
private string _avgPrice;
public string AvgPrice
{
get { return _avgPrice; }
set { _avgPrice = value; OnPropertyChanged("AvgPrice"); }
}
private string _shares;
public string Shares
{
get { return _shares; }
set { _shares = value; OnPropertyChanged("Shares"); }
}
}
您的模型应如下所示:
public class WatchlistModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
private Dictionary<string, StockModel> _stocks;
public Dictionary<string, StockModel> Stocks
{
get { return _stocks; }
set { _stocks = value; OnPropertyChanged("Stocks"); }
}
}
您不需要 StocksModel...您需要 StockModel 的字典。至于这如何与 INotifyPropertyChanged 一起工作,那就是另一回事了。但是对于 json 正确的模型就是这个答案中显示的。
你应该可以做类似 JsonConvert.Deserialize(jsonString)
此外,作为触发 OnPropertyChanged 事件之前的建议,您应该检查该值是否实际发生了变化。类似于:
if(_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
最后,您的 OnPropertyChanged 实现应使用“调用者”属性,这样您就不必硬编码 属性 名称,例如“名称”。
我在这个问题上花了2天时间还是没有解决这个问题...
Json 来自 Firebase 实时数据库。
我的绝对目标是在 class 中获取密钥 (Zaptec) 作为名称,而不是必须创建一个“名称”属性。但这是我改天再问的问题。
我的输出:
姓名=我的监视列表
股票=Models.StocksModel(但值为空)
{
"name": "My Watchlist",
"stocks": {
"Zaptec": {
"avgPrice": "2,14",
"name": "Zaptec",
"shares": 121
}
}
}
public class WatchlistModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
private StocksModel _stocks;
public StocksModel Stocks
{
get { return _stocks; }
set { _stocks = value; OnPropertyChanged("Stocks"); }
}
}
public class StocksModel : INotifyPropertyChanged
{
private StockModel _stocks;
public StockModel Stocks
{
get { return _stocks; }
set { _stocks = value; OnPropertyChanged("Stocks"); }
}
}
public class StockModel : INotifyPropertyChanged
{
#region -- Properties --
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
private string _avgPrice;
public string AvgPrice
{
get { return _avgPrice; }
set { _avgPrice = value; OnPropertyChanged("AvgPrice"); }
}
private string _shares;
public string Shares
{
get { return _shares; }
set { _shares = value; OnPropertyChanged("Shares"); }
}
}
您的模型应如下所示:
public class WatchlistModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
private Dictionary<string, StockModel> _stocks;
public Dictionary<string, StockModel> Stocks
{
get { return _stocks; }
set { _stocks = value; OnPropertyChanged("Stocks"); }
}
}
您不需要 StocksModel...您需要 StockModel 的字典。至于这如何与 INotifyPropertyChanged 一起工作,那就是另一回事了。但是对于 json 正确的模型就是这个答案中显示的。
你应该可以做类似 JsonConvert.Deserialize(jsonString)
此外,作为触发 OnPropertyChanged 事件之前的建议,您应该检查该值是否实际发生了变化。类似于:
if(_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
最后,您的 OnPropertyChanged 实现应使用“调用者”属性,这样您就不必硬编码 属性 名称,例如“名称”。