我有一些JSon的一部分,我正在尝试映射到C#对象。 JSon 的其余部分正确映射到对象,但只有这部分不映射任何内容,并且对象值为 null。
这是我正在调用的代码
var data = JObject.Parse(model.Data);
var dataModel = data.ToObject<MyModel>();
在MyModel
我有这个代码
public class P
{
public string R { get; set; }
public IList<SavedSearch> SavedSearches { get; set; }
public class SavedSearch
{
public string A { get; set; }
public string B { get; set; }
public string CD { get; set; }
}
}
相应的 JSon 代码段是
"p": [
{
"r": "something",
"savedSearches": [
{
"saved-search": {
"@a": "blah",
"@b": "blahblah",
"@c-d": "blahblahblah"
}
}
]
}
]
R 正确填充了正确的值,但A
、B
和 CD
没有。 必须如何更改 C# 模型才能解决此问题?
为"saved-search"
添加额外的间接寻址级别,并告知序列化程序如何将 JSON 属性名称映射到 c# 属性名称,因为 JSON 属性名称包含无效字符(例如 @
) 表示 C# 属性。 因此:
[DataContract]
public class P
{
[DataMember(Name="r")]
public string R { get; set; }
[DataMember(Name="savedSearches")]
public IList<SavedSearch> SavedSearches { get; set; }
[DataContract]
public class SavedSearch
{
[DataMember(Name="saved-search")]
public SavedSearchItem SavedSearchItem { get; set; }
}
[DataContract]
public class SavedSearchItem
{
[DataMember(Name="@a")]
public string A { get; set; }
[DataMember(Name = "@b")]
public string B { get; set; }
[DataMember(Name = "@c-d")]
public string CD { get; set; }
}
}
和
public class MyModel
{
public List<P> p { get; set; }
}
按如下方式使用时:
string json = @"
{""p"": [
{
""r"": ""something"",
""savedSearches"": [
{
""saved-search"": {
""@a"": ""blah"",
""@b"": ""blahblah"",
""@c-d"": ""blahblahblah""
}
}
]
}
]
}
";
var data = JObject.Parse(json);
var dataModel = data.ToObject<MyModel>();
Debug.WriteLine(JsonConvert.SerializeObject(dataModel, Formatting.Indented));
生产
{
"p": [
{
"r": "something",
"savedSearches": [
{
"saved-search": {
"@a": "blah",
"@b": "blahblah",
"@c-d": "blahblahblah"
}
}
]
}
]
}
顺便说一下,由于您无论如何都会重新映射属性名称,因此我建议在 c# 中使用比 R
、A
、B
和 CD
更多的描述性名称。