c# - Json.net 重写 DefaultContractResolver 中的方法以反序列化私有(private) setter

标签 c# json serialization get json.net

我有一个具有properties 的类,该类具有私有(private) setter,我希望使用 Json.Net 对这些属性进行反序列化。我知道我可以使用 [JsonProperty] 属性来执行此操作 我想通过实现 DefaultContractResolver 来执行此操作。 这是我一直在使用的一些示例代码,但是这个确实有效。

static void Main(string[] args)
{
    var a = new a();
    a.s = "somestring";
    a.set();
    Console.WriteLine(JsonConvert.SerializeObject(a));
    var strrr = JsonConvert.SerializeObject(a);

    var strobj = JsonConvert.DeserializeObject<a>(strrr,new                        JsonSerializerSettings
    {
        ContractResolver = new PrivateSetterContractResolver()
    });
    Console.Read();
}

这是我要序列化的类

public class a
{
    private int test;
    public int Test
    {
        get { return test; }
        private set { test = value; }
    }
    public string s { get; set; }

    public void set()
    {
        test = 33;
    }
}

这是 DefaultContractResolver 的实现

public class PrivateSetterContractResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        // whait do i do here ??? 

        //this dosent work
        return new List<MemberInfo>(objectType.GetProperties().ToList());

    }
}

最佳答案

找到解决方案 here .我试图覆盖错误的方法。您需要覆盖 CreateProperty 方法

protected override JsonProperty 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;
    }

关于c# - Json.net 重写 DefaultContractResolver 中的方法以反序列化私有(private) setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25077831/

相关文章:

c# - 缺少类型映射配置或不支持的映射

JSONPath 表达式 : getting the value of a specific attribute based on it's presence or the value of another attribute

json - 警告未定义的软件包已被忽略,因为它包含无效的配置。原因 : Cannot find module 'undefined/package.json'

c# - 将具有多个元素的 XML 反序列化为单个 C# 对象

c# - 在日期时间 c# 中格式化字符串以插入 MYSQL 日期时间列

c# - 通过 VIEWSTATE 抓取

C# 文件/目录权限

c# - VS2008 的本地窗口出现奇怪的结果

c# - 如何使用包含图像属性的 json.net 将对象序列化为 json

groovy 中闭包的序列化