简体   繁体   中英

Ignore all validation set on a model when using JsonConvert.SerializeObject

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,
}

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}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM