Home > Software engineering >  Ignore all validation set on a model when using JsonConvert.SerializeObject
Ignore all validation set on a model when using JsonConvert.SerializeObject

Time:06-21

I have a model from a library like below and it cannot be changed.

public class Request
{
    [JsonProperty("firstName", Required = Required.Always)]
    public string FirstName { get; set; }

    [JsonProperty("lastName", Required = Required.Always)]
    public string LastName { get; set; }
}

Now, if I initialize it with a field null and try to serialize it, it errors out (Example below).

var request = new Request() { FirstName = "John" };
var obj = JsonConvert.SerializeObject(request);

Newtonsoft.Json.JsonSerializationException : Cannot write a null value for property 'lastName'. Property requires a value. Path ''.

I want to serialize without any kind of validation. My requirement is to get output as below:

{
    "firstName": "John",
    "lastName": null,
}

CodePudding user response:

You can iterate each property and override that setting using a custom contract resolver:

class IgnoreRequiredContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var props = base.CreateProperties(type, memberSerialization);

        foreach (var prop in props)
        {
            prop.Required = Required.Default;
        }

        return props;
    }
}

then

var obj = JsonConvert.SerializeObject(request, new JsonSerializerSettings
        {
            ContractResolver = new IgnoreRequiredContractResolver()
        });

and your resulting json will be

{"firstName":"John","lastName":null}
  • Related