首页 > 解决方案 > c# 将 JSON 反序列化为 3 个类

问题描述

我在这个问题上花了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"); }
    }
}

标签: c#jsonfirebasefirebase-realtime-databasejson-deserialization

解决方案


您的模型应如下所示:

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”一样硬编码属性名称。


推荐阅读