Deserializing public property with non-public setter in json.net

后端 未结 3 903
栀梦
栀梦 2020-12-10 16:13

Suppose I have the following class -

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

Using json.net, I am able to seria

3条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-10 16:25

    This is my solution to handle in more general case:

    class CustomResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            JsonProperty result = base.CreateProperty(member, memberSerialization);
    
            var propInfo = member as PropertyInfo;
            result.Writable |= propInfo != null 
                 && propInfo.CanWrite
                 && !propInfo.IsPrivate;
    
            return result;
        }
    }
    

    With class CInternalSetter:

    class CInternalSetter
    {
        public CInternalSetter()
        {
            LoggedEmployeeId3 = 10;
        }
        public int LoggedEmployeeId { get; set; }
        public int LoggedEmployeeId2 { get; internal set; }
        public int LoggedEmployeeId3 { get; }
        public override string ToString()
        {
            return JsonConvert.SerializeObject(this, Formatting.Indented);
        }
    }
    

    Then test it with against this class:

    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.ContractResolver = new CustomResolver();
    
    var c = new CInternalSetter()
    {
        LoggedEmployeeId = 1,
        LoggedEmployeeId2 = 2
    };
    
    var cString = JsonConvert.SerializeObject(c);
    
    Console.WriteLine(cString);
    Console.WriteLine(JsonConvert.DeserializeObject(cString).ToString());
    Console.WriteLine("-------------------------------------------");
    Console.WriteLine(JsonConvert.DeserializeObject(cString, settings).ToString());
    

提交回复
热议问题