0

Mise à jour: en raison de la réponse, j'ai trouvé l'ancien titre non pertinent et le changer à partir du 'Comment mettre en œuvre JsonConverter personnalisé qui utilise JsonConvert 'à ce que c'est actuellement.Comment lier un json à une collection Interface, et vice versa dans un modèle utilisant MVC.Net


Je suis dans une situation limite très serré et le temps, et je dois faire comme ce que dit le titre ...

j'ai essayé plusieurs façons jusqu'au matin, le modèle ne se lie pas, la méthode semblable à FormCollection dans MVC renvoie des nulls, et ainsi de suite et ainsi de suite, puisque j'ajoute une liste d'interfaces à un de mon modèle, donc je dois le manipuler, ... bugs de rapport de client du matin, et leur système est sous pression, donc je ne peux pas m'en empêcher mais travailler jusqu'à ce que ça répare.

voici mon code actuel:

Qu'arrive-t-? une fois la méthode de l'écrivain renvoie le serveur renvoie 500 erreur de serveur interne ...

naturellement ils le font en utilisant l'objet serializer, mais je ne sais pas comment faire cette personnalisation en utilisant le sérialiseur, donc j'ai vraiment besoin d'appeler cette méthode qui accepter un paramètre de sérialiseur.

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(); 
    } 
} 

échantillon Modèle:

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

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

Répondre

0

Et pourtant, je suis incapable de faire ce que je lui ai demandé, mais je résolu le problème en utilisant une autre façon,

Donc, si vous trouvez la réponse, je Marquez le vôtre, sinon je change le titre de liaison d'interface afin que l'autre utilisateur puisse le trouver facilement, et voici ma réponse pour résoudre le problème.

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; 
    } 
}