Json.net将属性添加到包含特定类型的
我想为DateTime类型的每个属性向json添加一个属性 我有一个自定义转换器,并在CreateProperties上有一个覆盖(见下文)。调试时,返回的属性列表包含新值,但当json到达浏览器时,它不包含新属性Json.net将属性添加到包含特定类型的,.net,json.net,.net,Json.net,我想为DateTime类型的每个属性向json添加一个属性 我有一个自定义转换器,并在CreateProperties上有一个覆盖(见下文)。调试时,返回的属性列表包含新值,但当json到达浏览器时,它不包含新属性 protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { var proper
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
foreach(var prop in base.CreateProperties(type, memberSerialization))
{
if(prop != null
&& (prop.PropertyType == typeof(DateTime) || prop.PropertyType == typeof(DateTime?)))
{
properties.Add(new JsonProperty() {
PropertyName = String.Format("{0}$$type", prop.PropertyName),
PropertyType = typeof(String)
});
}
}
return properties;
}
受保护的重写IList CreateProperties(类型类型,MemberSerialization MemberSerialization)
{
var properties=base.CreateProperties(类型、成员序列化);
foreach(base.CreateProperties中的var prop(类型、成员序列化))
{
if(prop!=null
&&(prop.PropertyType==typeof(DateTime)| | prop.PropertyType==typeof(DateTime?)
{
添加(新的JsonProperty(){
PropertyName=String.Format(“{0}$$type”,prop.PropertyName),
PropertyType=typeof(字符串)
});
}
}
归还财产;
}
首先想到的是,新的Json属性随后会被删除,因为它们是无效的。可能是因为它们没有值,但是我看不到在这里设置值的方法
任何想法都是非常受欢迎的您正试图通过。您的问题是没有完全初始化的所需值。至少您必须初始化
- 和。你已经在这样做了
- 至
和true
false
- 返回要在JSON中看到的序列化对象的值
- 返回空属性集合的自定义实现
- ,然后去做一些似是而非的事
{
"NotADate": "a value",
"ADate": "2017-04-23T14:25:43.511-04:00",
"AnotherDate": "2017-04-23T14:25:43.511-04:00",
"ADate$$type": "DateTime",
"AnotherDate$$type": "DateTime"
}
它还可以基于某些其他属性创建合成属性。例如,以下内容为模型中的每个DateTime
属性添加了Date
属性:
public class AddDateFromDateTimeContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
for (int i = 0, n = properties.Count; i < n; i++)
{
var prop = properties[i];
if (prop.PropertyType == typeof(DateTime) || prop.PropertyType == typeof(DateTime?))
{
var name = string.Format("{0}$$date", prop.PropertyName);
var newProp = new JsonProperty
{
DeclaringType = type,
PropertyName = name,
UnderlyingName = name,
PropertyType = prop.PropertyType,
ValueProvider = new DateTimeToDateValueProvider(prop.ValueProvider),
AttributeProvider = NoAttributeProvider.Instance,
Readable = true,
Writable = false,
// Ensure PreserveReferencesHandling and TypeNameHandling do not apply to the synthetic property.
ItemIsReference = false,
TypeNameHandling = TypeNameHandling.None,
};
properties.Add(newProp);
}
}
return properties;
}
}
public class DateTimeToDateValueProvider : ValueProviderDecorator
{
public DateTimeToDateValueProvider(IValueProvider baseProvider) : base(baseProvider) { }
public override object GetValue(object target)
{
var baseValue = base.GetValue(target);
if (baseValue is DateTime)
{
return ((DateTime)baseValue).Date;
}
return baseValue;
}
public override void SetValue(object target, object value)
{
throw new NotImplementedException();
}
}
public abstract class ValueProviderDecorator : IValueProvider
{
readonly IValueProvider baseProvider;
public ValueProviderDecorator(IValueProvider baseProvider)
{
if (baseProvider == null)
throw new ArgumentNullException();
this.baseProvider = baseProvider;
}
public virtual object GetValue(object target) { return baseProvider.GetValue(target); }
public virtual void SetValue(object target, object value) { baseProvider.SetValue(target, value); }
}
演示两个合同解析程序的示例。您需要初始化
JsonProperty
的所有属性,尤其是值提供程序
。这里有一个例子:或。请分享一个你想要返回的JSON的例子,这样我们就可以完全回答你的问题。这正是我想要的。非常感谢你的帮助
{
"NotADate": "a value",
"ADate": "2017-04-23T14:25:43.511-04:00",
"AnotherDate": "2017-04-23T14:25:43.511-04:00",
"ADate$$type": "DateTime",
"AnotherDate$$type": "DateTime"
}
public class AddDateFromDateTimeContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
for (int i = 0, n = properties.Count; i < n; i++)
{
var prop = properties[i];
if (prop.PropertyType == typeof(DateTime) || prop.PropertyType == typeof(DateTime?))
{
var name = string.Format("{0}$$date", prop.PropertyName);
var newProp = new JsonProperty
{
DeclaringType = type,
PropertyName = name,
UnderlyingName = name,
PropertyType = prop.PropertyType,
ValueProvider = new DateTimeToDateValueProvider(prop.ValueProvider),
AttributeProvider = NoAttributeProvider.Instance,
Readable = true,
Writable = false,
// Ensure PreserveReferencesHandling and TypeNameHandling do not apply to the synthetic property.
ItemIsReference = false,
TypeNameHandling = TypeNameHandling.None,
};
properties.Add(newProp);
}
}
return properties;
}
}
public class DateTimeToDateValueProvider : ValueProviderDecorator
{
public DateTimeToDateValueProvider(IValueProvider baseProvider) : base(baseProvider) { }
public override object GetValue(object target)
{
var baseValue = base.GetValue(target);
if (baseValue is DateTime)
{
return ((DateTime)baseValue).Date;
}
return baseValue;
}
public override void SetValue(object target, object value)
{
throw new NotImplementedException();
}
}
public abstract class ValueProviderDecorator : IValueProvider
{
readonly IValueProvider baseProvider;
public ValueProviderDecorator(IValueProvider baseProvider)
{
if (baseProvider == null)
throw new ArgumentNullException();
this.baseProvider = baseProvider;
}
public virtual object GetValue(object target) { return baseProvider.GetValue(target); }
public virtual void SetValue(object target, object value) { baseProvider.SetValue(target, value); }
}
{
"NotADate": "a value",
"ADate": "2017-04-23T14:25:43.511-04:00",
"AnotherDate": "2017-04-23T14:25:43.511-04:00",
"ADate$$date": "2017-04-23T00:00:00-04:00",
"AnotherDate$$date": "2017-04-23T00:00:00-04:00"
}