2017-06-13 11 views
2

生成されたJSONの$ idプロパティーと$ refプロパティーが外部リソースによって受け入れられないという問題があります。しかし、私たちはこれを内部的に必要とするため、単にPreserveReferencesHandlingをグローバルに無効にすることはできません。単一の外部タイプのJSON.Net PreserveReferencesHandlingを無効にする

これを1つのタイプに対してのみ無効にするにはどうすればよいですか?私は[JsonObject]属性を見てきましたが、このクラスは外部ソースからのものなので、属性を追加することはできません。 IContractResolverを調べましたが、参照処理を無効にする方法がわかりませんでした。

ありがとうございます!

  • JSON.Net v10.0.2

答えて

0

これは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にしたいかもしれません。

+0

ありがとう、これは私が探していたものです! –

関連する問題