JSONオブジェクトと私が持っているいくつかのC#POCOオブジェクトを比較するツールを作ろうとしています。このツールは、新しいフィールドが追加されたときや古いオブジェクトがオブジェクトに比べて削除されたときを検出するのに役立ちます。Json.NetでデシリアライズするときにJSON以外のプロパティを検出する
「新しいフィールド」の場合は単純です。 SerializerSettings
では、MissingMemberHandling
プロパティをError
に設定し、リスナーをError
イベントに追加しました。 C#フィールドがない場合、イベントは詳細とともに呼び出されます。
「古いフィールド」の場合(C#フィールド/プロパティが設定されていない場合)は解決しにくいようです。以下のサンプルコードを参照してください。このコードは問題なく実行され、新しいJSONフィールドが表示された場合を検出しますが、Field2
がJSONに存在しない場合は検出されません。私は(デシリアライズのためにと設定のコールバック)契約リゾルバを実装しようとしましたが、彼らは(唯一の種類ごと)フィールドごとに呼び出されません
class TestObject
{
public int Field1 { get; set; }
public int Field2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
string exampleJson = @"{ ""Field1"": 1 }";
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MissingMemberHandling = MissingMemberHandling.Error;
settings.Error = Error;
try
{
TestObject obj = JsonConvert.DeserializeObject<TestObject>(exampleJson, settings);
Console.WriteLine("Object had no errors");
}
catch (Exception)
{
Console.WriteLine("Object had errors");
}
}
private static void Error(object sender, ErrorEventArgs errorEventArgs)
{
Console.WriteLine(errorEventArgs.ErrorContext.Path + " had " + errorEventArgs.ErrorContext.Error.Message);
}
}
...
最後に。 [DataMember(IsRequired = true)]
属性または[JsonProperty(Required = Required.Always)]
属性を追加することはできません。