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 关注
- 92 浏览
添加回答
举报