来自Jobject Newtonsoft的继承

Gus*_*Gus 3 c# serialization json.net

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

为什么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}

    }
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Evk*_*Evk 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想在对象上同时拥有动态和静态属性 - 则无需从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);
Run Code Online (Sandbox Code Playgroud)

  • 那么,不要继承JObject或解释为什么你绝对必须这样做,也许我们可以找到另一种解决方法. (2认同)