我有一個(C#)物件,我想使用 .NET 6 System.Text.Json 序列化程式對其進行序列化。我的物件看起來像這樣:
private List<Substitution> _substitutions;
public string? Name { get; private set; }
public string EmailAddress { get; private set; }
public IReadOnlyCollection<Substitution> Substitutions => _substitutions.AsReadOnly();
當我實體化 is 并對其進行序列化時,我得到一個看起來像預期的 JSON 字串:
{
"Name":"Foo Bar",
"EmailAddress":"[email protected]",
"Substitutions":[
{"Key":"Firstname","Value":"Foo"},
{"Key":"Lastname","Value":"Bar"}
]
}
現在,當我嘗試將此值反序列化回一個物件時,我得到了這個奇特的錯誤:
' objectname '型別的反序列化建構式中的每個引數都必須系結到反序列化時的物件屬性或欄位。每個引數名稱必須與物件上的屬性或欄位匹配。匹配可以不區分大小寫。
我已經發現 IReadOnlyCollection 是這里的問題。它列在 JSON 序列化/反序列化支持的資料型別中,所以我希望它可以作業。該錯誤描述了建構式缺少接受所有序列化的欄位。我對大小寫進行了一些嘗試,因此 JSON 中的欄位與屬性的名稱相匹配,不幸的是沒有成功。
該物件包含此建構式:
public Recipient(string name, string emailAddress, List<Substitution> substitutions)
{
EmailAddress = emailAddress;
Name = name;
_substitutions = substitutions;
}
我以為我在那里很好,但顯然不是;)我的想法是我想在物件中維護替換串列,因此公開僅準備好的副本是強制性行為。
我的問題是,如何正確反序列化這個物件?非常感謝!
uj5u.com熱心網友回復:
您可以使用帶有私有空建構式的https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonconstructorattribute?view=net-6.0來告訴反序列化器使用空建構式相反,讓它根據屬性反序列化。應該管用!
uj5u.com熱心網友回復:
這實際上取決于您的業務需求,但您可以完全洗掉_substitutions并宣告Recipient如下:
public class Recipient
{
public Recipient(string name, string emailAddress, IReadOnlyCollection<Substitution> substitutions)
{
EmailAddress = emailAddress;
Name = name;
Substitutions = substitutions;
}
public string? Name { get; private set; }
public string EmailAddress { get; private set; }
public IReadOnlyCollection<Substitution> Substitutions { get; private set; }
}
私有 setter onSubstitutions提供System.Text.Json了實際設定此屬性的機會。
uj5u.com熱心網友回復:
你不需要一個特殊的建構式,你可以這樣反序列化
public class Recipient
{
private List<Substitution>? _substitutions;
private string? _name;
private string? _emailAddress;
public string? Name
{
get { return _name; }
set { if (_name == null) _name = value; }
}
public string? EmailAddress
{
get { return _emailAddress; }
set { if (_emailAddress == null) _emailAddress = value; }
}
public IReadOnlyCollection<Substitution> Substitutions
{
get { return _substitutions.AsReadOnly(); }
set { if(_substitutions==null) _substitutions = value.ToList(); }
}
}
uj5u.com熱心網友回復:
這是問題的答案,但功勞都歸于 Paul Karam,因為他在評論中提出了解決方案。
我更改了Recipient物件的建構式,所以它看起來像這樣:
public Recipient(string name, string emailAddress, IReadOnlyCollection<Substitution>? substitutions)
{
EmailAddress = emailAddress;
Name = name;
_substitutions = substitutions != null ? substitutions.ToList() : new List<Substitution>();
}
但是,這可行...我的物件有多個建構式,現在序列化程式不知道要使用哪個建構式,結果不一致。JsonConstructor要解決此問題,您可以使用該屬性提示正確的建構式。我的物件現在看起來像這樣,就像一個魅力:
public Recipient(string emailAddress)
{
_substitutions = new List<Substitution>();
SetEmailAddress(emailAddress);
}
[JsonConstructor]
public Recipient(string name, string emailAddress, IReadOnlyCollection<Substitution>? substitutions)
{
EmailAddress = emailAddress;
Name = name;
_substitutions = substitutions != null ? substitutions.ToList() : new List<Substitution>();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/439304.html
上一篇:如何在顫振中決議嵌套的JSON?
