Скажем, у меня есть объект в этом формате:
new LookUpResponse
{
LookUpDetails =
new List<LookUpDetail>
{
new LookUpDetail
{
LookUpCode = "GB00B6RLLV55",
CitiCode = "GTUI",
UnitName = "Liontrust Asia Income A Inc",
UniverseCode = "O",
IsFundDriver = false
}
}
};
Я хочу, чтобы пользователи могли выбирать, какие дочерние свойства возвращать (например, selectField="LookUpDetail[LookUpCode,CitiCode]"
), затем мой код анализирует его, поэтому яДля типа LookupDetail мы хотим вернуть Lookkupcode и citicode.
Возможно ли это с newton.json?
Я пробовал это:
public class SelectFieldsResolver : DefaultContractResolver
{
private readonly IEnumerable<string> _selectFields;
public SelectFieldsResolver(IEnumerable<string> selectFields)
{
_selectFields = selectFields;
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance => {
if (!_selectFields.IsNullOrEmpty() && !_selectFields.Any(f => string.Equals(f, property.PropertyName, StringComparison.InvariantCultureIgnoreCase))) return false;
var value = instance?.GetType().GetProperty(property.PropertyName)?.GetValue(instance, null);
return value != null;
};
return property;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
return type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Select(p => {
var jp = CreateProperty(p, memberSerialization);
jp.ValueProvider = new NullToEmptyStringValueProvider(p);
return jp;
}).ToList();
}
}
Однако методCreateProperty и CreateProperties вызываются только на корневом уровне (вызывается для свойства LookUpDetails), и я хочу, чтобы при сериализации дочернего объекта LookUpDetail эти функции также вызывались, поэтому я могу исключить поля дочерних объектов.
Возможно ли это?