Poiché l'obiettivo è ignorare una proprietà sulla serializzazione ma non la deserializzazione, è possibile utilizzare uno ContractResolver
.
Si noti che la seguente classe fa proprio questo, ed è basata su CamelCasePropertyNamesContractResolver
, per assicurarsi che si serializzi su campi Json con casing cammello. Se non lo desideri, puoi invece ereditarlo da DefaultContractResolver
.
Inoltre, l'esempio che ho avuto è basato sul nome di una stringa, ma è possibile verificare facilmente se la proprietà è decorata dal proprio attributo personalizzato anziché confrontare il nome della proprietà.
public class CamelCaseIgnoringPropertyJsonResolver<T> : CamelCasePropertyNamesContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
// list the properties to ignore
var propertiesToIgnore = type.GetProperties()
.Where(x => x.GetCustomAttributes().OfType<T>().Any());
// Build the properties list
var properties = base.CreateProperties(type, memberSerialization);
// only serialize properties that are not ignored
properties = properties
.Where(p => propertiesToIgnore.All(info => info.Name != p.UnderlyingName))
.ToList();
return properties;
}
}
Quindi, è possibile utilizzarlo come segue:
static private string SerializeMyObject(object myObject)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCaseIgnoringPropertyJsonResolver<JsonIgnoreSerializeAttribute>()
};
var json = JsonConvert.SerializeObject(myObject, settings);
return json;
}
Infine, l'attributo personalizzato può essere di qualsiasi tipo, ma per abbinare l'esempio:
internal class JsonIgnoreSerializeAttribute : Attribute
{
}
L'approccio è testato, e funziona anche con oggetti nidificati.
fonte
2015-10-02 13:56:16
hanno bisogno di essere gli attributi? cosa vuoi fare nel tuo attributo di serializzazione personalizzato? –
Vorrei poter ignorare una proprietà sulla serializzazione ma non sulla deserializzazione. Ho pensato che sarebbe stato semplice aggiungere semplicemente un attributo, ad es. '[JsonIgnoreSerialize]' alla proprietà. –