您可以創建一個custom contract resolver從DefaultContractResolver
或CamelCasePropertyNamesContractResolver
繼承該重置contract default value的財產回default(T)
:
public class NoDefaultValueContractResolver : DefaultContractResolver
{
// As of 7.0.1, Json.NET suggests using a static instance for "stateless" contract resolvers, for performance reasons.
// http://www.newtonsoft.com/json/help/html/ContractResolver.htm
// http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Serialization_DefaultContractResolver__ctor_1.htm
// "Use the parameterless constructor and cache instances of the contract resolver within your application for optimal performance."
static NoDefaultValueContractResolver instance;
// Explicit static constructor to tell C# compiler not to mark type as beforefieldinit
static NoDefaultValueContractResolver() { instance = new NoDefaultValueContractResolver(); }
public static NoDefaultValueContractResolver Instance { get { return instance; } }
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.AttributeProvider.GetAttributes(typeof(DefaultValueAttribute), true).Any())
{
property.DefaultValue = property.PropertyType.GetDefaultValue();
}
return property;
}
}
public static class TypeExtensions
{
public static object GetDefaultValue(this Type type)
{
if (type == null)
throw new ArgumentNullException("type");
if (!type.IsValueType || Nullable.GetUnderlyingType(type) != null)
return null;
return Activator.CreateInstance(type, true);
}
}
然後使用它像:
var settings = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, ContractResolver = NoDefaultValueContractResolver.Instance };
var json = JsonConvert.SerializeObject(obj, settings);
通過使用自定義的合同解析器您可以避免需要爲每個類型或成員創建轉換器,這些轉換器在某個地方有DefaultValueAttribute
。
來源
2016-08-18 16:15:38
dbc
刪除了[tag:javascript]標記,問題純粹是關於C#方面的事情。 –
我不確定我瞭解問題所在。 DefaultValueAttribute被設計爲供UI設計者使用 - 它實際上並沒有在底層類上設置任何默認值。它不應該被JsonSerializer序列化 - 你可以添加生成的Json流的片段,突出顯示數據中的問題請 – PhillipH