我如何反序列化这种类型的数据结构

时间:2018-11-02 10:12:17

标签: c# .net json json.net

这是我的JSON:

"Dt": {    
    "20171021": {    
      "abc": "-"    
    },    
    "20171022": {    
      "abc": "-"    
    },    
    "20171023": {    
      "abc": "-"    
    },    
    "20171024": {    
      "abc": "-"    
    },    
    "20171025": {    
      "abc": "-"    
    }
}

Dt中的属性都是动态的。它们都是日期,但为字符串格式。所以我在考虑是否需要一个List对象,但是JSON.Net如何将其映射到List中?我在考虑类结构,类似于:

public class Dt
{
    public List<RealDate> RealDates { get; set;}
}

public class RealDate
{
    public string Date{ get; set;} //to hold "20171021"

    public Tuple<string, string> Keys {get; set;} // to hold abc as Key1 and - as Key2
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

看起来没有public class MainWindowModel : ObservableObject { public MainWindowModel() { } private int _currentPage; public int currentPage { get { return _currentPage; } set { _currentPage = value; OnPropertyChanged("currentPage"); } // below will be more properties } } ,而目前 Dt实际上应该具有:

Dt

其中public Dictionary<string, Foo> Dt { get; set;} 是:

Foo

然后您将对其进行后处理,以将DTO模型(序列化模型)转换为您的 actual 模型。

请记住:只要序列化数据的外观与域模型的外观之间甚至存在细微的差别,就可以:添加DTO模型,然后手动在它们之间进行映射。这样可以节省您的理智。

答案 1 :(得分:1)

您的json无效(缺少括号),但以下json

{
    "Dt": {
        "20171021": {
            "abc": "-"
        },
        "20171022": {
            "abc": "-"
        },
        "20171023": {
            "abc": "-"
        },
        "20171024": {
            "abc": "-"
        },
        "20171025": {
            "abc": "-"
        }
    }
}

可以反序列化为以下对象:

public class Model
{
    [JsonProperty("Dt")]
    public Dictionary<string, Value> Data { get; set; }
}

public class Value
{
    [JsonProperty("abc")]
    public string Abc { get; set; }
}

测试代码:

string json = @"{
    ""Dt"": {    
    ""20171021"": {    
      ""abc"": ""-""    
    },    
    ""20171022"": {    
      ""abc"": ""-""    
    },    
    ""20171023"": {    
      ""abc"": ""-""    
    },    
    ""20171024"": {    
      ""abc"": ""-""    
    },    
    ""20171025"": {    
      ""abc"": ""-""    
    }
}
}";

var model = JsonConvert.DeserializeObject<Model>(json);