您可以创建一个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