亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

反序列化泛型類型無法設置類型 T 的屬性

反序列化泛型類型無法設置類型 T 的屬性

C#
白衣非少年 2023-09-16 15:13:32
我在使用 Json.Net 將 JSON 字符串反序列化為通用類型時遇到一些問題。我遇到的問題是泛型類的屬性正在正確反序列化,在這種情況下,SomeStrings下面的屬性將按預期填充,但該Data屬性被保留null。我希望有人能夠闡明我所缺少的內容,因為序列化相同類型工作正常。請參閱下面的類結構:public class Foo{    public List<string> SomeStrings { get; protected set; } = new List<string>();    protected Foo()    {    }}public class GenericFoo<TBar> : Foo{    public TBar Data { get; private set; }    private GenericFoo() {}    public GenericFoo(TBar data)    {        Data = data;    }    public GenericFoo(TBar data, params string[] someStrings) :this(data)    {        SomeStrings = someStrings.ToList();    }}public class DataClass{    public int Id { get; set; }}我正在運行的代碼:var settings = new JsonSerializerSettings(){    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor};var response = new GenericFoo<DataClass>(new DataClass(){    Id = 10}, "Test");//serialises completely finevar json = JsonConvert.SerializeObject(response, settings); //Produces JSON: {"Data":{"Id":10},"SomeStrings":["Test"]}//all properties deserialised fine, Data left nullvar obj = JsonConvert.DeserializeObject<GenericFoo<DataClass>>(json, settings); 
查看完整描述

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

? ? }

}

.Net Fiddle 運行代碼。


查看完整回答
反對 回復 2023-09-16
?
慕碼人8056858

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;

}


查看完整回答
反對 回復 2023-09-16
  • 2 回答
  • 0 關注
  • 132 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號