gpt4 book ai didi

c# - JSON.NET 不会反序列化到私有(private)属性

转载 作者:行者123 更新时间:2023-11-30 23:20:58 29 4
gpt4 key购买 nike

我正在尝试从 REST 服务反序列化 JSON。我正在将 JSON 反序列化为一个结构。该结构包含公共(public)属性。我想隐藏基本的 string/int 对象,并为每个值使用正确的对象。在这样做的过程中,我隐藏了原始属性,尽管如此,我还是想找到一种方法来填充它们。我找到了一个 relevant answer在 stackoverflow 上。问题是私有(private)属性在反序列化过程中实际上并没有被赋予任何值。

然后我尝试创建自己的 ContractResolver。我找到了 CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 的以下代码。

var prop = base.CreateProperty(member, memberSerialization);
if (!prop.Writable)
{
var property = member as PropertyInfo;
if (property != null)
{
var hasPrivateSetter = property.GetSetMethod(true) != null;
prop.Writable = hasPrivateSetter;
}
}

return prop;

这仍然没有分配给完全私有(private)的属性。我不确定如何从这里开始,因为我能够找到的所有解决方案都使用这两种解决方案的变体。我应该如何进行?

编辑:

我创建了一个小示例来展示我的问题。 https://gist.github.com/Herbstein/9ea14e2a4d95dd5aa4430384bfeeedf3

最佳答案

仅处理私有(private) setter 是不够的,您必须允许属性本身是私有(private)的:

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;
}
}

如果我不也提到 AutoMapper 就太失职了作为此类问题的更通用解决方案。这需要您声明更多的类,但也会使类型本身更简单。

关于c# - JSON.NET 不会反序列化到私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39527932/

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