【发布时间】:2021-09-16 02:48:00
【问题描述】:
我有以下类型:
public class Product : Dictionary<string, object>
{
[JsonInclude]
public string ProductId { get; set; }
public Product(string productId) : base()
{
ProductId = productId;
}
}
当使用 System.Text.Json 进行序列化时,它不包括属性(即ProductId)。
添加或删除[JsonInclude] 似乎没有任何效果。
测试用例:
[Fact]
public void SimpleTest()
{
var p = new Product("ABC123");
p["foo"] = "bar";
var json = JsonSerializer.Serialize(p);
Assert.Contains("productId", json, StringComparison.OrdinalIgnoreCase);
}
并收到输出:
{"foo":"bar"}
在序列化过程中,如何让它在我的类型中包含我的自定义属性? (注意:不要关心反序列化)。
【问题讨论】:
-
你希望这个输出如何?
-
是的,这是正确的。
System.Text.Json仅序列化字典键和值而不是 c# 属性,因为 1)可能有一个与属性同名的键,以及 2)您可能不想要像Count这样的“标准”属性和IsReadOnly被序列化。我在 MSFT 文档中找不到任何说明这一点的地方,但是 Newtonsoft 是 documented to behave this way,DataContractJsonSerializer和JavaScriptSerializer也是如此。System.Text.Json似乎有先例。 -
您可能会考虑一个不同的数据模型,其中
Product不继承自Dictionary,而是具有[System.Text.Json.Serialization.JsonExtensionData] public Dictionary<string, object> Properties { get; set; }属性。[JsonExtensionData]属性导致字典属性在序列化时作为父对象的一部分包含在内。 -
除此之外,您还需要编写自定义
JsonConverter。 (根据docs forJsonInclude当应用于属性时,表示非公共的getter和setter可以用于序列化和反序列化。所以这里不相关,因为ProductId已经有公共getter 和 setter。) -
@dbc 实际上 JsonExtensionData 属性可能会起作用,我会检查一下,谢谢。提交它作为答案,我会接受
标签: c# json serialization .net-5 system.text.json