加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 18:41:01 所属栏目:百科 来源:网络整理
导读:假设我有以下课程 – public class A { public int P1 { get; internal set; }} 使用json.net,我能够使用P1属性序列化类型.但是,在反序列化期间,未设置P1.如果不修改A类,是否有一种构建方式来处理这个问题?在我的情况下,我使用来自不同程序集的类,不能修改
假设我有以下课程 –

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

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

解决方法

是的,您可以使用自定义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;
    }
}

要使用解析程序,请创建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);
    }
}

输出:

42

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读