これはDefaultContractResolver.CreateContract()
をオーバーライドすることでJsonContract.IsReference == false
を設定custom ContractResolver
で行うことができます。
public class DisableReferencePreservationContractResolver : DefaultContractResolver
{
readonly HashSet<Type> types;
public DisableReferencePreservationContractResolver(IEnumerable<Type> types)
{
this.types = new HashSet<Type>(types);
}
bool ContainsType(Type type)
{
return types.Contains(type);
//return types.Any(t => t.IsAssignableFrom(type));
}
bool? GetIsReferenceOverride(Type type)
{
return ContainsType(type) ? false : (bool?)null;
}
protected override JsonContract CreateContract(Type objectType)
{
// Disable IsReference for this type of object
var contract = base.CreateContract(objectType);
contract.IsReference = contract.IsReference ?? GetIsReferenceOverride(objectType);
return contract;
}
}
コンストラクタはのためのタイプのリストを渡す必要があります参照情報を無効にする。 正確なタイプのインスタンスについては、この情報をコントラクトリゾルバに渡します。 JsonSerializerSettings
に設定すると
bool ContainsType(Type type)
{
return types.Any(t => t.IsAssignableFrom(type));
}
注意も契約リゾルバがPreserveReferencesHandling
を無効にしますが、シリアライズで直接設定ない:あなたにも派生型のインスタンスからこの情報を除外したい場合は、次のようにContainsType()
を修正することができます外部タイプの属性は[JsonObject(IsReference = true)]
または[JsonProperty(IsReference = true)]
です。
サンプルfiddle。
あなたは最高のパフォーマンスのためにcache the contract resolverにしたいかもしれません。
出典
2017-06-13 10:00:06
dbc
ありがとう、これは私が探していたものです! –