Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化泛型类型无法设置类型T的属性_C#_Json.net - Fatal编程技术网

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

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

我在使用JSON.Net将JSON字符串反序列化为泛型类型时遇到了一些问题

我遇到的问题是泛型类上的属性被正确反序列化,在这种情况下,下面的
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检查我的