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

amb*_*ivi 6 json.net deserialization

假设我有以下课程 -

public class A 
{        
   public int P1 { get; internal set; }
}
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ers 5

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

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

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

演示:

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

输出:

42
Run Code Online (Sandbox Code Playgroud)

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