我有一些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#模型来解决这个问题?
答案 0 :(得分:3)
您需要为"saved-search"
添加额外级别的间接,并且还告知序列化程序如何将JSON属性名称映射到c#属性名称,因为JSON属性名称包含invalid characters(例如{ {1}})用于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));
顺便说一下,由于您无论如何都要重新映射属性名称,我建议您在c#中使用比{
"p": [
{
"r": "something",
"savedSearches": [
{
"saved-search": {
"@a": "blah",
"@b": "blahblah",
"@c-d": "blahblahblah"
}
}
]
}
]
}
,R
,A
和B
更多的描述性名称。