次のコードでは、Json.Netを使用してオブジェクトをシリアル化します。このJsonには型名が埋め込まれています。私はエラーを誘発するためにタイプ名の1つを変更します(これはテストです、私は既存のプロジェクトで実際の問題を扱っています)。私がJsonを逆シリアル化するとき、私は、型名が詰まったプロパティのnull値を持つオブジェクトを取得することを期待しています。代わりに、シリアライザはクラップアウトし、nullを返します。私の期待は正しいですか?どういうわけか設定を変更して、ルートオブジェクトに対してnull以外のオブジェクトを取得できますか?私が得た2番目のエラーは、シリアライザにバグがあることを示唆しています。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 { }
}
[問題](https://github.com/JamesNK/Newtonsoft.Json/issues/1266#event-1025062578)として報告しましたが、修正されました。 – AbleArcher