在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |