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

标签 c# json json.net

我正在尝试从 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/

相关文章:

c# - 使用\U escape 时出现编译错误

c# - .Net 3.5 使用代码约定实现 String.IsNullOrWhitespace

javascript - 用双引号替换 JSON 对象值单引号

c# - ASP.NET Core Json 对象的格式很奇怪\u0022

c# - Entity Framework - 如何在多个应用程序之间共享一些表

c# - 在c#中解析来自多个json数组的数据

android - OkHttp Android 发布导致错误 JSON 格式错误

r - 使用 purrr 或 rlist 从 json 文件中查找元素

c# - 使用带有 JsonPath 的 SelectTokens 的问题/错误

c# - Json.Net 将复杂查询字符串转换为 JsonString