Im folgenden Code serialisiere ich ein Objekt mit Json.Net. Dieser Json hat eingebettete Typnamen. Ich ändere dann einen der Typnamen, um einen Fehler zu erzeugen (dies ist ein Test, ich habe es mit einem echten Problem in einem bestehenden Projekt zu tun). Wenn ich den JSON deserialize, erwarte ich, ein Objekt zurück zu erhalten, das einen Nullwert für die Eigenschaft mit dem Namen des fiedled Typen hat. Stattdessen scheißt der Serializer und gibt null zurück. Sind meine Erwartungen richtig? Kann ich die Einstellungen irgendwie ändern, so dass ich ein Nicht-Null-Objekt für mein Root-Objekt bekomme? Beachten Sie, dass der zweite Fehler, den ich erhalte, darauf hindeutet, dass ein Fehler im Serializer vorliegt.Unerwarteter Fehler beim Deserialisieren unbekannter Typen mit Json.Net
static public class JsonTest
{
static public void Test()
{
// Create test object
A a = new A
{
MyTest = new MyTest(),
};
// Serialize it.
string json = JsonConvert.SerializeObject(a, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
// Fiddle class name to induce error
json = json.Replace("+MyTest", "+MyTest2");
// Before: {"MyTest":{"$type":"<Namespace>.JsonTest+MyTest, <Assembly>"}}
// After: {"MyTest":{"$type":"<Namespace>.JsonTest+MyTest2, <Assembly>"}}
// Deserialize
A a2 = JsonConvert.DeserializeObject<A>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Error = (object sender, ErrorEventArgs e) =>
{
e.ErrorContext.Handled = true; // Should have only one error: the unrecognized Type
}
});
// A second error occurs: Error = {Newtonsoft.Json.JsonSerializationException: Additional text found in JSON string after finishing deserializing object....
// a2 is null
}
public class A
{
public ITest MyTest { get; set; }
}
public interface ITest { }
public class MyTest : ITest { }
}
Ich berichtete dies als [Problem] (https://github.com/JamesNK/Newtonsoft.Json/issues/1266#event-1025062578), und es wurde behoben. – AbleArcher