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<CInternalSetter>(cString).ToString());
Console.WriteLine("-------------------------------------------");
Console.WriteLine(JsonConvert.DeserializeObject<CInternalSetter>(cString, settings).ToString());