Ausgabe
Ich verwende Json.NET, um ein Objekt zu deserialisieren, das ein verschachteltes Wörterbuch mit einem benutzerdefinierten Schlüsseltyp (keine Zeichenfolge) enthält. Hier ist ein Beispiel dessen, was ich zu tun versuche
public interface IInterface
{
String Name { get; set; }
}
public class AClass : IInterface
{
public string Name { get; set; }
}
public class Container
{
public Dictionary<IInterface, string> Map { get; set; }
public Container()
{
Map = new Dictionary<IInterface, string>();
}
}
public static void Main(string[] args)
{
var container = new Container();
container.Map.Add(new AClass()
{
Name = "Hello World"
}, "Hello Again");
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
PreserveReferencesHandling = PreserveReferencesHandling.All,
};
string jsonString = JsonConvert.SerializeObject(container, Formatting.Indented, settings);
var newContainer = JsonConvert.DeserializeObject<Container>(jsonString);
}
Dies ergibt die Ausnahmemeldung:
Die Zeichenfolge „ConsoleApplication1.AClass“ konnte nicht in den Wörterbuchschlüsseltyp „ConsoleApplication1.IInterface“ konvertiert werden. Erstellen Sie einen TypeConverter zum Konvertieren von der Zeichenfolge in das Schlüsseltypobjekt. Bitte akzeptieren Sie meine Entschuldigung, aber ich kann keine Möglichkeit finden, die Schnittstelle im Wörterbuchschlüssel zu deserialisieren.
Lösung
Das Problem ist, dass JSON-Wörterbücher (Objekte) nur Zeichenfolgenschlüssel unterstützen, sodass Json.Net Ihren komplexen Schlüsseltyp in eine Json-Zeichenfolge konvertiert (durch Aufrufen von ToString()), die dann nicht erneut in den komplexen Typ deserialisiert werden kann. Stattdessen können Sie Ihr Wörterbuch als Sammlung von Schlüssel-Wert-Paaren serialisieren, indem Sie das JsonArray-Attribut anwenden.
Siehe diese Frage für Details.
Beantwortet von – ChaseMedallion
Antwort geprüft von – Katrina (FixError Volunteer)