Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON.NET不会反序列化到私有属性_C#_Json_Json.net - Fatal编程技术网

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

C# JSON.NET不会反序列化到私有属性,c#,json,json.net,C#,Json,Json.net,我正在尝试从REST服务反序列化JSON。我正在将JSON反序列化为一个结构。结构包含公共属性。我想隐藏基本的字符串/int对象,并为每个值使用正确的对象。在这样做时,我隐藏了原始属性,并希望找到一种方法来填充它们。我在stackoverflow上找到了一个。问题是,在反序列化过程中,私有属性实际上没有被分配任何值 然后,我尝试创建自己的ContractResolver。我找到了CreateProperty(MemberInfo成员、MemberSerialization成员序列化)的以下代码

我正在尝试从REST服务反序列化JSON。我正在将JSON反序列化为一个结构。结构包含公共属性。我想隐藏基本的
字符串
/
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;
    }
}