JSON.NET不会反序列化到私有属性

本文关键字:属性 反序列化 NET JSON | 更新日期: 2023-09-27 18:07:10

我正在尝试从REST服务反序列化JSON。我将JSON反序列化为结构体。结构体包含公共属性。我想隐藏基本的string/int对象,并为每个值使用正确的对象。在这样做的过程中,我隐藏了原始属性,并希望找到一种方法来填充它们。我在stackoverflow上找到了一个相关的答案。问题是私有属性在反序列化期间实际上没有被分配任何值。

然后我尝试创建我自己的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;

这仍然没有分配给完全私有的属性。我不确定如何从这里开始,因为我能找到的所有解决方案都是这两个解决方案的变体。我该怎么做?

编辑:

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

JSON.NET不会反序列化到私有属性

处理私有设置是不够的,你必须允许属性本身是私有的:

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作为这类问题的更通用的解决方案,那将是我的疏忽。这要求您声明更多的类,但也使类型本身更简单。