c# - 反序列化泛型类型无法设置类型 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);
解决方案
要反序列化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;
}
推荐阅读
- node.js - 架构后端和前端解决方案(nodeJS)
- google-analytics - 在 BigQuery 中使用 WITHIN 子句时出错
- javascript - 如何管理翻译复杂的 React 应用程序
- sql-server - 我可以更改运行 SQL Server 的系统的主机名吗?
- excel - 我需要检查目标工作表中是否已经有一行,如果是,我不希望它复制并创建重复项
- c# - 如何修复浏览器无法在调试模式下打开?
- reactjs - React props 对象 vs 数组组件更新
- c - 如何将计算存储在for循环中,因此每次计算时都会更新一个整数值并稍后打印出来,C
- python - Python 中的括号问题。在最小时间和空间内求解?
- aurelia - “aurelia-polyfills”不起作用(或者我们无法正确导入它)