Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Jobject Newtonsoft继承_C#_Serialization_Json.net - Fatal编程技术网

C# 从Jobject Newtonsoft继承

C# 从Jobject Newtonsoft继承,c#,serialization,json.net,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();

从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}

    }
}

有什么想法吗?

无论您想这样做的原因是什么-原因很简单:
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);
公共类测试{
公共int Id{get;set;}
公共字符串名称{get;set;}
[JsonExtensionData]
公共字典附加属性{get;set;}=new Dictionary();
}
var测试=新测试();
测试.附加属性[“new_pro”]=123456;
测试Id=1;
test.Name=“Dog”;
var r=Newtonsoft.Json.JsonConvert.SerializeObject(测试);

为什么从JObject继承?只需创建自己的类并将其序列化。@krillgar我想OP希望能够向对象添加动态属性,这就引出了一个问题:当JObject执行任务时,为什么要有一个自定义类?很少有属性是动态的。嗨,这个解决方法对我来说不是个好主意。我的类包含许多属性(列表、嵌套对象等),但不从JObject继承,也不向我们解释为什么您必须这样做,也许我们可以找到另一种解决方法。@Gus我用一个选项扩展了答案,可能这就是您需要的。我决定寻找这个项目。[。感谢您的帮助。我需要为类创建动态属性。[JsonExtensionData]非常完美!我还尝试了从JObject继承的错误尝试。这个解决方案对我来说非常有用。