gpt4 book ai didi

c# - 从 Jobject Newtonsoft 继承

转载 作者:行者123 更新时间:2023-11-30 13:44:21 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com