Я использую ContractResolver
в своем коде:
public class ShouldSerializeContractResolver : DefaultContractResolver
{
List<string> propertyList { get; set; }
public ShouldSerializeContractResolver(List<string> propertyList)
{
this.propertyList = propertyList;
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance =>
{
if (propertyList.Any())
return propertyList.Contains(property.PropertyName);
return true;
};
return property;
}
}
, где propertyList
- список обязательных атрибутов для сериализации
Что если в данных будут одинаковые классы и атрибуты??Например:
public class Product
{
public int? Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public ProductPrice subProductA { get; set; }
public ProductDiscount subProductB { get; set; }
}
public class ProductPrice
{
public int? Id { get; set; }
public string Name { get; set; }
public Amount amount { get; set; }
}
public class ProductDiscount
{
public int? SubId { get; set; }
public string SubName { get; set; }
public Amount amount { get; set; }
}
public class Amount
{
public int? amountId { get; set; }
public string amountName { get; set; }
public Value value { get; set; }
}
public class Value
{
public int? valueId { get; set; }
public string valueName { get; set; }
}
}
Я хочу сериализовать экземпляр класса Product
и сериализовать атрибут Product.ProductPrice.Amount.Value.valueId
, но не Product.ProductDiscount.Amount.Value.valueId
string myResponseBody = JsonConvert.SerializeObject(product, Formatting.Indented, new JsonSerializerSettings { ContractResolver = contractResolver });
return WebOperationContext.Current.CreateTextResponse(myResponseBody,
"application/json; charset=utf-8",
Encoding.UTF8);
Возможно ли это сделать илине?Как мы можем выбрать необходимый JsonProperty?Можно сравнить DeclaredTypes, но это не работает для глубокой иерархии.