2012-11-28 14 views
5

Tôi thấy rằng khi sử dụng JSON.Net, tôi có thể giải mã các đối tượng đa hình nếu thuộc tính $type chỉ định loại cụ thể của đối tượng JSON. Trong tất cả các ví dụ tôi đã thấy, $type bao gồm không gian tên. Có thể thực hiện công việc này bao gồm chỉ một tên loại đơn giản mà không cần lắp ráp không? Tôi muốn được hạnh phúc để chỉ định một hội đồng mặc định để JsonSerializer nếu đó là có thể.JSON.Net: deserializing các loại đa hình mà không chỉ định assembly

tôi có thể deserialize JSON sử dụng:

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

tôi đã không thể làm công việc này với MVC. Tôi đang định cấu hình việc deserialization JSON cho mỗi mã bên dưới trong Application_Start và đối tượng được deserialized, nhưng sử dụng loại cơ sở một.

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; 

Trả lời

9

Tạo một có nguồn gốc SerializationBinder trong đó ghi đè BindToName và Set out string assemblyName null (Sửa: hoặc tên lắp ráp mặc định của bạn) và out string typeName để bạn tên kiểu sọc

Đặt chất kết dính để các JsonSerializerSettings.Binder trước serialization .

Hãy cho tôi biết nếu điều này không hoạt động

+0

JsonSerializerSettings.Binder hiện không còn được dùng nữa. – Theyouthis

Các vấn đề liên quan