C# JSON.NET不会反序列化到私有属性
我正在尝试从REST服务反序列化JSON。我正在将JSON反序列化为一个结构。结构包含公共属性。我想隐藏基本的C# JSON.NET不会反序列化到私有属性,c#,json,json.net,C#,Json,Json.net,我正在尝试从REST服务反序列化JSON。我正在将JSON反序列化为一个结构。结构包含公共属性。我想隐藏基本的字符串/int对象,并为每个值使用正确的对象。在这样做时,我隐藏了原始属性,并希望找到一种方法来填充它们。我在stackoverflow上找到了一个。问题是,在反序列化过程中,私有属性实际上没有被分配任何值 然后,我尝试创建自己的ContractResolver。我找到了CreateProperty(MemberInfo成员、MemberSerialization成员序列化)的以下代码
字符串
/int
对象,并为每个值使用正确的对象。在这样做时,我隐藏了原始属性,并希望找到一种方法来填充它们。我在stackoverflow上找到了一个。问题是,在反序列化过程中,私有属性实际上没有被分配任何值
然后,我尝试创建自己的ContractResolver
。我找到了CreateProperty(MemberInfo成员、MemberSerialization成员序列化)
的以下代码
这仍然不会分配给完全私有的属性。我不知道如何从这里开始,因为我能够找到的所有解决方案都使用了这两种解决方案的变体。我应该如何进行
编辑:
我创建了一个小示例来展示我的问题 仅处理私有setter是不够的,您必须允许属性本身是私有的:
internal class PrivateResolver : DefaultContractResolver {
protected override IList<JsonProperty> CreateProperties(
Type type, MemberSerialization memberSerialization
) {
return type
.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic)
.Select(p => CreateProperty(p, memberSerialization))
.ToList();
}
protected override JsonProperty CreateProperty(
MemberInfo member, MemberSerialization memberSerialization
) {
var prop = base.CreateProperty(member, memberSerialization);
if (!prop.Writable && (member as PropertyInfo)?.GetSetMethod(true) != null) {
prop.Writable = true;
}
return prop;
}
}
内部类PrivateSolver:DefaultContractResolver{
受保护的重写IList CreateProperties(
类型类型,成员序列化成员序列化
) {
返回类型
.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic)
.Select(p=>CreateProperty(p,memberSerialization))
.ToList();
}
受保护的重写JsonProperty CreateProperty(
MemberInfo成员,MemberSerialization成员序列化
) {
var prop=base.CreateProperty(成员,成员序列化);
如果(!prop.Writable&&(成员为PropertyInfo)?.GetSetMethod(true)!=null){
prop.Writable=true;
}
返回道具;
}
}
如果我没有提到这是解决此类问题的更普遍的方法,那我就是失职了。这要求您声明更多的类,但也使类型本身更简单。请创建一个实例来演示您的问题。目前,您没有显示您的模型是什么样子的,您如何将契约解析器设置为Serializer,您实际如何进行序列化,等等@RB我马上就做。@RB。我创建了一个小例子,链接在OP中。程序的输出和所有可能的配置只是一个空行。
internal class PrivateResolver : DefaultContractResolver {
protected override IList<JsonProperty> CreateProperties(
Type type, MemberSerialization memberSerialization
) {
return type
.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic)
.Select(p => CreateProperty(p, memberSerialization))
.ToList();
}
protected override JsonProperty CreateProperty(
MemberInfo member, MemberSerialization memberSerialization
) {
var prop = base.CreateProperty(member, memberSerialization);
if (!prop.Writable && (member as PropertyInfo)?.GetSetMethod(true) != null) {
prop.Writable = true;
}
return prop;
}
}