2 回答

TA貢獻1873條經驗 獲得超9個贊
通過將[JsonConstructor]
屬性應用于構造函數
使用
JsonConstructorAttribute
指定在反序列化期間應使用構造函數來創建類。
public class GenericFoo<TBar> : Foo {
? ? public TBar Data { get; private set; }
? ? private GenericFoo() { }
? ? public GenericFoo(TBar data) {
? ? ? ? Data = data;
? ? }
? ? [JsonConstructor]
? ? public GenericFoo(TBar data, params string[] someStrings) : this(data) {
? ? ? ? SomeStrings = someStrings.ToList();
? ? }
}
反序列化時我得到了所需的行為。即使沒有設置
public class Program
{
? ? public static void Main()
? ? {
? ? ? ? var response = new GenericFoo<DataClass>(new DataClass()
? ? ? ? {Id = 10}, "Test");
? ? ? ? //serialises completely fine
? ? ? ? var json = JsonConvert.SerializeObject(response);
? ? ? ? var obj = JsonConvert.DeserializeObject<GenericFoo<DataClass>>(json);
? ? ? ? Console.WriteLine(obj.Data.Id); // Prints 10
? ? }
}

TA貢獻1803條經驗 獲得超6個贊
要反序列化您的SomeString,只需使用JsonProperty ,如下所示:
[JsonProperty]
public List<string> SomeStrings { get; protected set; }
這不適用于具有私有 setter 的公共通用屬性。但它適用于私有或受保護的通用屬性。(也許是一個錯誤?)
[JsonProperty]
private TBar Data { get; set; }
這可以通過使用隱藏屬性進行序列化來解決,如下所示:
[JsonIgnore]
public TBar Data { get; private set; }
[JsonProperty(PropertyName = nameof(Data))]
private TBar PrivateData
{
get => Data;
set => Data = value;
}
- 2 回答
- 0 關注
- 132 瀏覽
添加回答
舉報