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;
JsonSerializerSettings.Binder hiện không còn được dùng nữa. – Theyouthis