Es wäre besser, einen Konverter zu erstellen, die die Dictionary-Objekte erstellen würden je nach Bedarf. Genau dafür wurde die Newtonsoft.Json.Converters.CustomCreationConverter<T>
entwickelt.
Hier ist eine Implementierung, die Wörterbücher erstellen kann, die benutzerdefinierte Vergleiche erfordert.
public class CustomComparerDictionaryCreationConverter<T> : CustomCreationConverter<IDictionary>
{
private IEqualityComparer<T> comparer;
public CustomComparerDictionaryCreationConverter(IEqualityComparer<T> comparer)
{
if (comparer == null)
throw new ArgumentNullException("comparer");
this.comparer = comparer;
}
public override bool CanConvert(Type objectType)
{
return HasCompatibleInterface(objectType)
&& HasCompatibleConstructor(objectType);
}
private static bool HasCompatibleInterface(Type objectType)
{
return objectType.GetInterfaces()
.Where(i => HasGenericTypeDefinition(i, typeof(IDictionary<,>)))
.Where(i => typeof(T).IsAssignableFrom(i.GetGenericArguments().First()))
.Any();
}
private static bool HasGenericTypeDefinition(Type objectType, Type typeDefinition)
{
return objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeDefinition;
}
private static bool HasCompatibleConstructor(Type objectType)
{
return objectType.GetConstructor(new Type[] { typeof(IEqualityComparer<T>) }) != null;
}
public override IDictionary Create(Type objectType)
{
return Activator.CreateInstance(objectType, comparer) as IDictionary;
}
}
Sie jedoch beachten, dass dieser Konverter für alle Wörterbuchtypen gelten, wo der Schlüssel mit T
covariant ist, unabhängig von Werttyp.
Dann, es zu benutzen:
var converters = new JsonConverter[]
{
new CustomComparerDictionaryCreationConverter<string>(StringComparer.OrdinalIgnoreCase),
};
var dict = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, object>>>(jsonString, converters);
Nun, ich dachte über die gleiche Sache, aber in einigen Fällen haben Sie keine Kontrolle über die Erstellung von Wörterbüchern. Das äußere Wörterbuch kann leicht in das CaseInsensitive Dictionary konvertiert werden, aber um das innere Wörterbuch zu konvertieren, wird es viel Overhead für mich bedeuten. Deshalb suche ich nach einer generischen Lösung, aber nicht nach einer Problemumgehung. – Bug
Vielleicht sollten Sie Ihre Frage bearbeiten, um diese Anforderung anzugeben und weitere Details zu Ihrer Situation anzugeben.Zum Beispiel, wie machst du jetzt die Deserialisierung? Was ist in deiner Kontrolle und was nicht? Haben Sie einen Beispielcode, der Ihnen zeigen kann, was Sie gerade tun oder tun? Je mehr Details Sie angeben, desto besser werden die Antworten, die Sie erhalten. –
Fertig. Danke Brian. – Bug