Ich habe eine benutzerdefinierte List-Klasse, die eine Reihe von Element-IDs aus Performance-Gründen unterhält:Deserialize, um benutzerdefinierte Liste
public class MyCustomList : List<ItemWithID>
{
private HashSet<int> itemIDs = new HashSet<int>();
public MyCustomList()
{
}
[JsonConstructor]
public MyCustomList(IEnumerable<ItemWithID> collection)
: base(collection)
{
itemIDs = new HashSet<int>(this.Select(i => i.ID));
}
public new void Add(ItemWithID item)
{
base.Add(item);
itemIDs.Add(item.ID);
}
public new bool Remove(ItemWithID item)
{
var removed = base.Remove(item);
if (removed)
{
itemIDs.Remove(item.ID);
}
return removed;
}
public bool ContainsID(int id)
{
return itemIDs.Contains(id);
}
}
ich diese Liste von einem einfach JSON-Array zB deserialisieren möchten:
JsonConvert.DeserializeObject<MyCustomList>("[{ID:8},{ID:9}]");
Dadurch ruft JSON.NET nur den leeren Konstruktor auf, sodass meine itemIDs-Liste leer bleibt. Auch die Add-Methode wird nicht aufgerufen.
Wie fügt JSON.NET die Elemente zur Liste hinzu, damit ich an dieser Stelle Logik hinzufügen kann.
(dies ist etwa Deserialisierung ohne Eigenschaften, die im JSON-String hartnäckig sein sollten, so dass die vorgeschlagene doppelte Frage hat nichts mit diesem zu tun)
kein Duplikat (siehe aktualisierte Frage) –
Ihr Problem besteht nicht in der JSON-Deserialisierung, Ihre 'MyCustomList' muss von' IList' abgeleitet werden, wenn Sie * die 'Add'-Methode überschreiben wollen. Details finden Sie in [THIS] (http://StackOverflow.com/q/580202/2140173). –
@Meowhow danke ich verstehe jetzt den Unterschied zwischen Neu und Override. Mach das zur Antwort und ich werde es akzeptieren. –