gpt4 book ai didi

c# - 反序列化泛型类型无法设置类型 T 的属性

转载 作者:行者123 更新时间:2023-11-30 22:53:07 24 4
gpt4 key购买 nike

我在使用 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);

最佳答案

申请[JsonConstructor]构造函数的属性

Use the JsonConstructorAttribute to specify that a constructor should be used to create a class during deserialization.

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 of running code.

关于c# - 反序列化泛型类型无法设置类型 T 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57608092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com