从JObject继承的新特性

6

继承自Jobject(Newtonsoft)的类,存在的属性不会被序列化。

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

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

class Program
{
    static void Main(string[] args)
    {
        var test = new Test();
        test["new_pro"] = 123456;
        test.Id = 1;
        test.Name = "Dog";


        var r = Newtonsoft.Json.JsonConvert.SerializeObject(test);

        // Result = { "new_pro":123456}

    }
}

有什么想法吗?

3
为什么要继承自 JObject?只需创建自己的类并对其进行序列化即可。 - krillgar
2
@krillgar 我猜 OP 想要能够向对象添加动态属性,这就引出了一个问题:当 JObject 可以胜任时,为什么要有自定义类呢? - DavidG
少数属性是动态的。 - Gus
1个回答

14

无论你想这样做的原因是什么 - 原因很简单: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);

嗨,这种解决方法对我来说不是一个好主意。我的类包含许多属性(列表、嵌套对象等)。 - Gus
3
那么请不要从JObject继承,或者解释一下为什么你必须这样做,也许我们可以找到另一种解决方法。 - Evk
@Gus 我已经加入了另一种选项的答案,可能这正是你所需要的。 - Evk
我决定查看这个项目:[https://github.com/RickStrahl/Expando]。感谢您的帮助。我需要为一个类创建动态属性。 - Gus
[JsonExtensionData]非常完美!我之前还试图从JObject继承,但这个解决方案对我来说非常好。 - tarrball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接