I use Newtonsoft JSON to serialize/deserialize my objects. One of those contains an array with a protected setter because the constructor build the array itself and only the
Try this:
var contractResolver = new DefaultContractResolver();
contractResolver.DefaultMembersSearchFlags |= BindingFlags.NonPublic;
Engine r = JsonConvert.DeserializeObject(json), new JsonSerializerSettings
{
ContractResolver = contractResolver
});
Using above-mentioned code you will get the follwoing Warning message:
'DefaultContractResolver.DefaultMembersSearchFlags' is obsolete: 'DefaultMembersSearchFlags is obsolete. To modify the members serialized inherit from DefaultContractResolver and override the GetSerializableMembers method instead.'
To solve it you can use the following solution instead:
Create a class that inherits from DefaultContractResolver
to get the non public properties:
public class CustomContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(
MemberInfo member,
MemberSerialization memberSerialization)
{
var prop = base.CreateProperty(member, memberSerialization);
if (!prop.Writable)
{
var property = member as PropertyInfo;
if (property != null)
{
var hasNonPublicSetter = property.GetSetMethod(true) != null;
prop.Writable = hasNonPublicSetter;
}
}
return prop;
}
}
And finally use it as follow:
var contractResolver = new CustomContractResolver();
Engine r = JsonConvert.DeserializeObject(json), new JsonSerializerSettings
{
ContractResolver = contractResolver
});