c# - 从 Jobject Newtonsoft 继承

标签 c# serialization json.net

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

    }
}

有什么想法吗?

最佳答案

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

关于c# - 从 Jobject Newtonsoft 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42203358/

相关文章:

c# - 在 C# 中引用多个 Web 服务时解决类型歧义

c# - 使用 key 将密码编码为 MD5

c# - Json.NET 在序列化时获取通用属性类型名称?

c# - 替换多个 JObject 中属性的 JSON 值

c# - Visual Studio : Can't load 2 versions of Json. NET 和使用别名

c# - 在没有 'slash' 的 ASP.NET Core 中路由

c# - 构建 GrayScaleBrushes 类

.net - 如何防止 XamlWriter.Save 序列化 BaseUri 属性?

c# - 如何将 JSON 值保留为字符串?

python - 去除 pickle 对象周围的字符串 wrapper ?