0

更新:の回答があるため、古いタイトルが無関係で、「JsonConvertを使用するカスタムJsonConverterを実装する方法'それは現在のものです。私は朝まで多くの方法を試してみましたMVC.Netを使用してモデル内でjsonをインターフェイスコレクションにバインドする方法


私は非常にタイトと時間限界状況にいるよ、と私はタイトルが言うようしなければならない...、モデルは、メソッドを結合しませんMVCのFormCollectionに似ていますが、私のモデルの1つにインターフェースのリストを追加するので、nullsなどを返します。私はそれを処理する必要があるので...朝のクライアントレポートのバグとそのシステムは、だから私はそれを助けることはできませんが、修正するまで働きます。

ここに私の現在のコード:

どうしますか?ライターメソッドがサーバーに返すと、内部サーバーエラー500を返します。

自然にシリアライザオブジェクトを使用してこれを行いますが、シリアライザを使用してこのカスタマイズを行う方法がわかりません。このメソッドを呼び出す必要があります。シリアライザ設定を受け入れます。

public class CollectionInterfaceConverterForModels<TInterface> : JsonConverter 
{ 
    private readonly TypeNameSerializationBinder Binder; 

    public CollectionInterfaceConverterForModels() 
    { 
     Binder = new TypeNameSerializationBinder("Cartable.Models.{0}, Cartable"); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(IList<TInterface>)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     //IList<TInterface> items = serializer.Deserialize<List<TInterface>>(reader).Cast<TInterface>().ToList(); 
     //return items; 
     var json = existingValue.ToString(); 
     if (json == null) 
      json = ""; 

     return JsonConvert.DeserializeObject<List<TInterface>>(json, 
      new JsonSerializerSettings 
      { 
       TypeNameHandling = TypeNameHandling.Auto, 
       Binder = Binder 
      }); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     //serializer.Serialize(writer, value, typeof(IList<T>)); 
     string serializeObject = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings 
     { 
      TypeNameHandling = TypeNameHandling.Auto, 
      Binder = Binder 
     }); 
     writer.WriteRaw(serializeObject); 
     writer.Flush(); 
    } 
} 

モデルのサンプル:まだ

public class IncomingFaxesVM 
{ 
    public long Code { get; set; } 
. 
. 
. 

    [JsonConverter(typeof(CollectionInterfaceConverterForModels<IMetadata>))] 
    public List<IMetadata> Metadata { get; set; } 
} 

答えて

0

、あなたは答えを見つけるのであれば、私は尋ねた何をすることができませんでしだが、私は別の方法を使用して問題を解決し、

、私は私は他のユーザーが簡単に見つけることができるようにインターフェイスのバインディングのタイトルを変更し、ここで私の答えは、問題を解決するためです。

public class CollectionInterfaceConverterForModels<TInterface> : JsonConverter 
{ 
    private readonly TypeNameSerializationBinder Binder; 

    public CollectionInterfaceConverterForModels() 
    { 
     Binder = new TypeNameSerializationBinder("Cartable.Models.{0}, Cartable"); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(IList<TInterface>)); 
    } 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var currentBinder = serializer.Binder; 
     var currentTypeNameHandling = serializer.TypeNameHandling; 

     serializer.TypeNameHandling = TypeNameHandling.Auto; 
     serializer.Binder = Binder; 

     IList<TInterface> items = serializer.Deserialize<List<TInterface>>(reader).ToList(); 

     serializer.TypeNameHandling = currentTypeNameHandling; 
     serializer.Binder = currentBinder; 

     return items; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     //The reason store these, is to leave system unchanged, in case it customized on general section by another programmer 
     var currentBinder = serializer.Binder; 
     var currentTypeNameHandling = serializer.TypeNameHandling; 

     serializer.TypeNameHandling=TypeNameHandling.Auto; 
     serializer.Binder = Binder; 

     serializer.Serialize(writer, value, typeof(List<TInterface>)); 

     serializer.TypeNameHandling = currentTypeNameHandling; 
     serializer.Binder = currentBinder; 
    } 
} 
関連する問題