2012-11-28 7 views
5

Ich sehe, dass mit JSON.Net, kann ich polymorphe Objekte zu dekodieren, wenn ein $type Attribut den spezifischen Typ des JSON-Objekts angibt. In allen Beispielen, die ich gesehen habe, enthält $type den Namensraum. Ist es möglich, dies zu tun, einschließlich nur eines einfachen Namens ohne die Assembly? Ich würde gerne eine Standard-Assembly für den JsonSerializer angeben, wenn das möglich ist.JSON.Net: Deserialisierung polymorpher Typen ohne Angabe der Baugruppe

Ich bin in der Lage, die JSON deserialisieren mit:

public class SingleAssemblyJsonTypeBinder : SerializationBinder 
{ 
    private readonly Assembly _assembly; 
    private Dictionary<string, Type> _typesBySimpleName = new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase); 
    private Dictionary<Type,string> _simpleNameByType = new Dictionary<Type, string>(); 

    public SingleAssemblyJsonTypeBinder(Assembly assembly) 
    { 
     _assembly = assembly; 
     _typesBySimpleName = new Dictionary<string, Type>(); 

     foreach (var type in _assembly.GetTypes().Where(t => t.IsPublic)) 
     { 
      if (_typesBySimpleName.ContainsKey(type.Name)) 
       throw new InvalidOperationException("Cannot user PolymorphicBinder on a namespace where multiple public types have same name."); 

      _typesBySimpleName[type.Name] = type; 
      _simpleNameByType[type] = type.Name; 
     } 
    } 

    public override Type BindToType(string assemblyName, string typeName) 
    { 
     Type result; 
     if (_typesBySimpleName.TryGetValue(typeName.Trim(), out result)) 
      return result; 

     return null; 
    } 

    public override void BindToName(Type serializedType, out string assemblyName, out string typeName) 
    { 
     string name; 

     if (_simpleNameByType.TryGetValue(serializedType, out name)) 
     { 
      typeName = name; 
      assemblyName = null;// _assembly.FullName; 
     } 
     else 
     { 
      typeName = null; 
      assemblyName = null; 
     } 
    } 
} 

...

public static JsonSerializerSettings GetJsonSerializationSettings() 
{ 
    var settings = new JsonSerializerSettings(); 
    settings.Binder = new SingleAssemblyJsonTypeBinder(typeof(MvcApplication).Assembly); 
    settings.TypeNameHandling = TypeNameHandling.Objects; 
    return settings; 
} 

...

var serializer = JsonSerializer.Create(settings); 

Ich habe nicht in der Lage gewesen, diese Arbeit zu machen mit MVC obwohl. Ich konfiguriere JSON Deserialisierung nach dem folgenden Code in Application_Start, und das Objekt wird deserialisiert, aber mit dem Basistyp eins.

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Binder = new SingleAssemblyJsonTypeBinder(this.GetType().Assembly); 
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All; 
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple; 

Antwort

9

Erstellen einer abgeleiteten SerializationBinder, in der Überschreibung BindToName und Set out string assemblyName auf null (bearbeiten: oder Ihr Standard-Assemblierung-Name) und out string typeName zu Ihrem gestreiften Typnamen

das Bindemittel auf die JsonSerializerSettings.Binder vor der Serialisierung Set .

Lassen Sie mich wissen, wenn das nicht funktioniert

+0

JsonSerializerSettings.Binder ist jetzt veraltet. – Theyouthis

Verwandte Themen