2016-05-21 3 views
0

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)]属性を追加することはできません。

答えて

0

解決策があるかもしれません。

ContractResolverを作成すると、実行時にすべてのプロパティをRequiredに設定できます。

class TestObject 
{ 

    public int Field1 { get; set; } 

    public int Field2 { get; set; } 

    public int Field3 { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string exampleJson = @"{ ""Field1"": 1, ""Field4"": 1 }"; 

     JsonSerializerSettings settings = new JsonSerializerSettings(); 
     settings.MissingMemberHandling = MissingMemberHandling.Error; 
     settings.ContractResolver = new ContractResolver(); 
     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) 
    { 
     errorEventArgs.ErrorContext.Handled = true; 
     Console.WriteLine(errorEventArgs.ErrorContext.Path + " had " + errorEventArgs.ErrorContext.Error.Message); 
    } 
} 

internal class ContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty res = base.CreateProperty(member, memberSerialization); 

     res.Required = Required.AllowNull; 

     return res; 
    } 
} 
:あなたは Errorコールバックで trueHandledを設定しない限り...これは私のモデルを変更せずにエラーになりますが、それは最初のエラーだけを与えます
関連する問題