2012-11-28 10 views
5

Widzę, że za pomocą JSON.Net mogę dekodować polimorficzne obiekty, jeśli atrybut $type określa konkretny typ obiektu JSON. We wszystkich przykładach, które widziałem, $type zawiera przestrzeń nazw. Czy możliwe jest wykonanie tej pracy zawierającej tylko prostą nazwę typu bez złożenia? Z przyjemnością podam domyślny zestaw do JsonSerializer, jeśli jest to możliwe.JSON.Net: deserializacja polimorficznych typów bez określania zespołu

jestem w stanie deserializować JSON przy użyciu:

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

I nie były w stanie dokonać tej pracy z MVC chociaż. Konfiguruję deserializację JSON zgodnie z kodem poniżej w Application_Start, a obiekt jest deserialized, ale przy użyciu typu podstawowego jeden.

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; 

Odpowiedz

9

Tworzenie pochodzi SerializationBinder w którym korekcja BindToName i Set out string assemblyName null (Edycja: lub domyślna nazwa zespołu) oraz out string typeName do rozłożony nazwy typu

Ustaw spoiwa do JsonSerializerSettings.Binder przed serializacji .

Daj mi znać, jeśli to nie działa

+0

JsonSerializerSettings.Binder jest obecnie przestarzałe. – Theyouthis

Powiązane problemy