JObject 到对象不映射



我有一些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# 模型才能解决此问题?

您需要

"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# 中使用比 RABCD 更多的描述性名称。

相关内容

  • 没有找到相关文章

最新更新