在DefaultContractResolver中使用Json.net覆盖方法来反序列化私有setter

rak*_*esh 9 c# serialization json get json.net

我有一个properties有私人制定者的类,我希望这些属性可以使用deSerialized 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();
}
Run Code Online (Sandbox Code Playgroud)

这是我要序列化的类

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是执行 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());

    }
}
Run Code Online (Sandbox Code Playgroud)

rak*_*esh 7

这里找到解决方案 .我试图覆盖错误的方法.你需要覆盖该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;
    }
Run Code Online (Sandbox Code Playgroud)