【问题标题】:c# Deserialize JSON to 3 classesc# 将 JSON 反序列化为 3 个类
【发布时间】:2023-03-23 05:30:02
【问题描述】:

我在这个问题上花了 2 天,仍然没有解决这个问题......

Json 来自 Firebase 实时数据库。

我的绝对目标是将密钥 (Zaptec) 作为类中的名称,而不必创建“名称”属性。但这是我另一天的问题。

我的输出:
Name = My Watchlist
Stocks = Models.StocksModel(但值为 null)

{
  "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"); }
    }
}

【问题讨论】:

  • 嘿,请检查我的答案。我解释了如何反序列化 Stocks 属性

标签: c# json firebase firebase-realtime-database json-deserialization


【解决方案1】:

您的模型应如下所示:

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 实现应该使用“Caller”属性,这样您就不必像“Name”那样硬编码属性名称。

【讨论】:

  • 谢谢! “调用者”属性是指这样的东西吗?:PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  • 我的视图模型基础上有这个: OnPropertyChanged([CallerMemberName] string propertyName = null) 但这不起作用...
  • @Gnusson 所以理论上你不需要传递属性名称......它应该自动选择它:OnPropertyChanged()
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
相关资源
最近更新 更多