在json.net中使用非公共setter反序列化公共属性

前端之家收集整理的这篇文章主要介绍了在json.net中使用非公共setter反序列化公共属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有以下课程 –

@H_502_8@

@H_502_8@

public class A 
{        
   public int P1 { get; internal set; }
}

使用json.net,我能够使用P1属性序列化类型.但是,在反序列化期间,未设置P1.如果不修改A类,是否有一种构建方式来处理这个问题?在我的情况下,我使用来自不同程序集的类,不能修改它.@H_502_8@

解决方法

是的,您可以使用自定义ContractResolver使内部属性可写入Json.Net.以下是您需要的代码

@H_502_8@

@H_502_8@

class CustomResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member,MemberSerialization memberSerialization)
    {
        JsonProperty prop = base.CreateProperty(member,memberSerialization);

        if (member.DeclaringType == typeof(A) && prop.PropertyName == "P1")
        {
            prop.Writable = true;
        }

        return prop;
    }
}

要使用解析程序,请创建JsonSerializerSettings的实例,并将其ContractResolver属性设置为自定义解析程序的新实例.然后,将设置传递给JsonConvert.DeserializeObject< T>().@H_502_8@

演示:@H_502_8@

@H_502_8@

class Program
{
    static void Main(string[] args)
    {
        string json = @"{ ""P1"" : ""42"" }";

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.ContractResolver = new CustomResolver();

        A a = JsonConvert.DeserializeObject<A>(json,settings);

        Console.WriteLine(a.P1);
    }
}

输出:@H_502_8@

@H_502_8@

42

小提琴:https://dotnetfiddle.net/1fw2lC@H_502_8@

猜你在找的Json相关文章