// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; using System.Web.Http; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace System.Net.Http.Formatting { /// /// Represents the default used by . /// It uses the formatter's to select required members and recognizes /// the type annotation. /// public class JsonContractResolver : DefaultContractResolver { private readonly MediaTypeFormatter _formatter; /// /// Initializes a new instance of the class. /// /// The formatter to use for resolving required members. public JsonContractResolver(MediaTypeFormatter formatter) { if (formatter == null) { throw Error.ArgumentNull("formatter"); } _formatter = formatter; // Need this setting to have [Serializable] types serialized correctly IgnoreSerializableAttribute = false; } // Determines whether a member is required or not and sets the appropriate JsonProperty settings private void ConfigureProperty(MemberInfo member, JsonProperty property) { if (_formatter.RequiredMemberSelector != null && _formatter.RequiredMemberSelector.IsRequiredMember(member)) { property.Required = Required.AllowNull; property.DefaultValueHandling = DefaultValueHandling.Include; property.NullValueHandling = NullValueHandling.Include; } else { property.Required = Required.Default; } } /// protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); ConfigureProperty(member, property); return property; } } }