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;
JsonSerializerSettings.Binder ist jetzt veraltet. – Theyouthis