JObject ToObject不映射

时间:2015-03-12 16:50:52

标签: c# json json.net

我有一些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正确填充了正确的值,但ABCD未正确填充。我该如何更改我的C#模型来解决这个问题?

1 个答案:

答案 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" } } ] } ] } RAB更多的描述性名称。