// 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;
}
}
}