【问题标题】:Inheritance from Jobject Newtonsoft从 Jobject Newtonsoft 继承
【发布时间】:2017-02-13 11:51:01
【问题描述】:

从 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?只需创建自己的类并对其进行序列化即可。
  • @krillgar 我猜 OP 希望能够为对象添加动态属性,这就引出了一个问题:当 JObject 完成这项工作时,为什么要有一个自定义类?
  • 很少有属性是动态的。

标签: c# serialization json.net


【解决方案1】:

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

【讨论】:

  • 您好,这种解决方法对我来说不是一个好主意。我的类包含许多属性(列表、嵌套对象等)
  • 那么不要从 JObject 继承或解释为什么你绝对必须这样做,也许我们可以找到另一种解决方法。
  • @Gus 我已经用另外一个选项扩展了答案,这可能就是你需要的。
  • 我决定寻找这个项目。 [github.com/RickStrahl/Expando]。谢谢你的帮助。我需要为一个类创建动态属性。
  • [JsonExtensionData] 是完美的!我也在尝试从 JObject 继承。这个解决方案对我很有效。
猜你喜欢
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多