Refaktor ShouldSerialize () w klasie… czy mogę używać IContractResolver?
Mam interfejs API, który zwraca dużą listę funkcji samochodu .... wszystkie są bool lub ints ... i zasadniczo chcę wyświetlać tylko te, które zwracają wartości prawdziwe lub> 0 dla int.
Korzystam z JSON.net, więc używam właściwości ShouldSerialize (), aby określić, czy powinienem serializować właściwość w oparciu o jej wartość, a mój kod wygląda tak:
public class Features
{
public bool ABS { get; set; }
public bool ShouldSerializeABS()
{
// don't serialize the ABS property if ABS is false
return (ABS != false);
}
public bool Immobiliser { get; set; }
public bool ShouldSerializeImmobiliser ()
{
// don't serialize the Immobiliser property if Immobiliser is false
return (Immobiliser != false);
}
public int BHP { get; set; }
public bool ShouldSerializeBHP ()
{
// don't serialize the BHP property if BHP is false
return (BHP != 0);
}
//..... etc
}
To działa świetnie i daje mi wyniki, których szukam, ale zastanawiałem się, czy istnieje sposób na ponowne obliczenie tego, aby moja klasa nie była zaśmiecona wszystkimi właściwościami ShouldSerialize ()?
SzukałemCopyConditional
właściwości zIContractResolver
nahttp://james.newtonking.com/projects/json/help/index.html?topic=html/ConditionalProperties.htm i wygląda na to, że można go użyćIContractResolver
do tego celu, ale wciąż wydaje mi się, że kończy się na wielu kodach, które wydają się nie zmieniać współczynnika
public class ShouldSerializeContractResolver : DefaultContractResolver
{
public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(Features) && property.PropertyName == "ABS")
{
property.ShouldSerialize =
instance =>
{
Features e = (Features)instance;
return e.ABS != false;
};
}
if (property.DeclaringType == typeof(Features) && property.PropertyName == "Immobiliser")
{
property.ShouldSerialize =
instance =>
{
Features e = (Features)instance;
return e.Immobiliser != false;
};
}
return property;
}
}
i ta metoda używająca ShouldSerializeContractResolver nie wydaje się usuwać właściwości z klasy, jeśli jest fałszywa ... każda pomoc jest bardzo mile widziana