来自Jobject Newtonsoft的继承

时间:2017-02-13 11:51:02

标签: c# serialization json.net

从Jobject(Newtonsoft)继承来自未序列化的类的existents属性。

为什么Id和Name属性没有序列化?

library(rvest)
# This is the url you provided
url <- 'https://el.wikipedia.org/wiki/%CE%91%CE%B8%CE%AE%CE%BD%CE%B1'
a <- read_html(url) %>% 
    # This select only the first node
    html_node('.free') %>% 
    # Extract the link
    html_attr('href') 

有什么想法吗?

1 个答案:

答案 0 :(得分:9)

您想要做的原因是什么 - 原因很简单:JObject实现IDictionary并且Json.NET以特殊方式处理此案例。如果你的类实现了IDictionary - Json.NET不会查看你的类的属性,而是会在字典中查找键和值。因此,为了解决您的问题,您可以这样做:

public class Test : JObject
{
    public int Id
    {
        get { return (int) this["id"]; }
        set { this["id"] = value; }
    }

    public string Name
    {
        get { return (string) this["name"]; }
        set { this["name"] = value; }
    }
}

如果您只想在对象上同时拥有动态和静态属性 - 则无需从JObject继承。相反,请使用JsonExtensionData属性:

public class Test {
    public int Id { get; set; }
    public string Name { get; set; }

    [JsonExtensionData]
    public Dictionary<string, JToken> AdditionalProperties { get; set; } = new Dictionary<string, JToken>();
}

var test = new Test();
test.AdditionalProperties["new_pro"] = 123456;
test.Id = 1;
test.Name = "Dog";            
var r = Newtonsoft.Json.JsonConvert.SerializeObject(test);