首页 > 解决方案 > 反序列化泛型类型无法设置类型 T 的属性

问题描述

我在使用 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 fine
var json = JsonConvert.SerializeObject(response, settings); 

//Produces JSON: {"Data":{"Id":10},"SomeStrings":["Test"]}

//all properties deserialised fine, Data left null
var obj = JsonConvert.DeserializeObject<GenericFoo<DataClass>>(json, settings); 

标签: c#json.net

解决方案


要反序列化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;
}

推荐阅读