2011-12-21 11 views
7

私はEntityFrameworkオブジェクトをシリアル化するためにJSON.netを使用しています。JSON.net "EntityKey"プロパティでJsonIgnoreAttributeが機能しない

以前は、 "JsonIgnore"属性をプロパティに適用するクラスを作成し、メインのEntityFrameworkクラスの "MetadataType"属性をその新しく作成したクラスに設定しました。ここ

は一例であり:

EFクラスに適用されるクラス:

public class Role_DoNotSerialize 
    { 
     [JsonIgnore] 
     public string Users { get; set; } 
    } 

EFクラスの部分クラスファイル:上記で

[MetadataType(typeof(Role_DoNotSerialize))] 
    public partial class Role 
    { 
    } 

例えば、 "Role"オブジェクトをシリアライズするとき、プロパティ "Users"は直列化されません。

私の問題は、これと同じ技術が動作するように失敗している私はそうのようなのEntityKeyプロパティに追加するとき:このクラスを使用して

public class Role_DoNotSerialize 
    { 
     [JsonIgnore] 
     public string Users { get; set; } 

     [JsonIgnore] 
     public System.Data.EntityKey EntityKey { get; set; } 
    } 

、「のEntityKey」プロパティは、まだシリアル化されます。私は間違って何をしていますか?

+0

よく書かれた良いコードです。さて、2つのトップビットは、動作するはずです。 –

+0

あなたの質問を使用して私の質問に答えを見つけました!+1 – theMothaShip

答えて

4

あなたは

public class ExcludeEntityKeyContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> properties = base.CreateProperties(type,memberSerialization); 
     return properties.Where(p => p.PropertyType != typeof (System.Data.EntityKey)).ToList(); 
    } 
} 

あなたは、あなたのJsonSerializerSettingsが

をオブジェクトに対してContractResolverを設定するには、これを設定することができます(古いバージョンでも可能JSON.NET 4.5にサンプルコードが、)あなた自身のContractResolverを実装することによってこれを行うことができます
JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); 
serializerSettings.ContractResolver = new ExcludeEntityKeyContractResolver(); 

あなたは1つのラムダ関数に限定されているわけではありませんが、必要な種類のチェックを実装できることに注意してください。カスタムシリアル化を実行するために、プロパティごとにコンバーターをオーバーライドすることもできます。

2

JSON.NETの最新バージョンがこれを賞賛していると思います。このサンプルはMVCサイトで私たちのために働いていましたが、必要に応じて文字列を使用することができます。

public ActionResult ContentJsonFormatted(object obj, Formatting formatting = Formatting.Indented) 
{ 
    string result = JsonConvert.SerializeObject(obj, formatting); 
    return Content(result, "text/plain"); 
} 
関連する問題