C# 反序列化泛型类型无法设置类型T的属性
我在使用JSON.Net将JSON字符串反序列化为泛型类型时遇到了一些问题 我遇到的问题是泛型类上的属性被正确反序列化,在这种情况下,下面的C# 反序列化泛型类型无法设置类型T的属性,c#,json.net,C#,Json.net,我在使用JSON.Net将JSON字符串反序列化为泛型类型时遇到了一些问题 我遇到的问题是泛型类上的属性被正确反序列化,在这种情况下,下面的SomeStrings属性将按预期填充,但数据属性保留为null 我希望有人能解释一下我遗漏了什么,因为序列化相同的类型很好 请参见下面的类结构: 公共类Foo { public List SomeStrings{get;protected set;}=new List(); 受保护的Foo() { } } 公共类GenericFoo:Foo { 公共TBa
SomeStrings
属性将按预期填充,但数据
属性保留为null
我希望有人能解释一下我遗漏了什么,因为序列化相同的类型很好
请参见下面的类结构:
公共类Foo
{
public List SomeStrings{get;protected set;}=new List();
受保护的Foo()
{
}
}
公共类GenericFoo:Foo
{
公共TBar数据{get;private set;}
私有GenericFoo(){}
公共通用FOO(待定数据)
{
数据=数据;
}
public GenericFoo(TBar数据,参数字符串[]someStrings):此(数据)
{
SomeStrings=SomeStrings.ToList();
}
}
公共类数据类
{
公共int Id{get;set;}
}
我正在运行的代码:
var settings=new JsonSerializerSettings()
{
ConstructorHandling=ConstructorHandling.AllowNonPublicDefaultConstructor
};
var response=newgenericfoo(newdataclass()
{
Id=10
}“测试”);
//连载很好
var json=JsonConvert.SerializeObject(响应、设置);
//生成JSON:{“数据”:{“Id”:10},“SomeStrings”:[“Test”]}
//所有属性反序列化良好,数据保留为空
var obj=JsonConvert.DeserializeObject(json,设置);
要反序列化您的SomeString,只需像下面这样使用JsonProperty即可:
[JsonProperty]
public List<string> SomeStrings { get; protected set; }
[JsonIgnore]
public TBar Data { get; private set; }
[JsonProperty(PropertyName = nameof(Data))]
private TBar PrivateData
{
get => Data;
set => Data = value;
}
这可以通过对序列化使用隐藏属性来解决,如下所示:
[JsonProperty]
public List<string> SomeStrings { get; protected set; }
[JsonIgnore]
public TBar Data { get; private set; }
[JsonProperty(PropertyName = nameof(Data))]
private TBar PrivateData
{
get => Data;
set => Data = value;
}
通过将属性应用于构造函数
使用JsonConstructorAttribute
指定在反序列化期间应使用构造函数创建类
公共类GenericFoo:Foo{
公共TBar数据{get;private set;}
私有GenericFoo(){}
公共通用FOO(待定数据){
数据=数据;
}
[JsonConstructor]
public GenericFoo(TBar数据,参数字符串[]someStrings):此(数据){
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
}
}
公共类程序
{
公共静态void Main()
{
var response=newgenericfoo(newdataclass()
{Id=10},“测试”);
//连载很好
var json=JsonConvert.SerializeObject(响应);
var obj=JsonConvert.DeserializeObject(json);
Console.WriteLine(obj.Data.Id);//打印10
}
}
您的类中没有无参数构造函数吗?尝试将该
private
设置为一个public
@VidmantasBlazevicius-使用serialiser设置中的ConstructorHandling=ConstructorHandling.AllowNonPublicDefaultConstructor
允许使用私有的无参数构造函数。@cmpbeeds检查我的