2013-04-12 19 views
6

私はデータ交換にJSONを使用しています。私はJSON.NETフレームワークを使用しています。JSON.NET:デシリアライズ時に不明なメンバーが処理する

私はクラスを持っている:

public class CarEntity 
{ 
    public string Model { get; set; } 
    public int Year { get; set; } 
    public int Price { get; set; } 
} 

そして、私は次のコードしている:

:私はそれについて警告をログに記録必要CarEntityクラスには "マイレージ" フィールドが存在しないので

public void Test() 
{ 
    var jsonString = 
    @"{ 
     ""Model"": ""Dodge Caliber"", 
     ""Year"": 2011, 
     ""Price"": 15000, 
     ""Mileage"": 35000 
    }"; 
    var parsed = (CarEntity)JsonConvert.DeserializeObject(jsonString, typeof(CarEntity)); 
} 

未知フィールド:マイレージ= 35000

これを実行する方法はありますか?

答えて

7

少しトリッキーですが、できます。

var parsed = (CarEntity)JsonConvert.DeserializeObject(jsonString, typeof(CarEntity), new JsonSerializerSettings() 
{ 
    MissingMemberHandling = MissingMemberHandling.Error, 
    Error = ErrorHandler 
}); 

し、[追加:あなたのコードが変更に

private static void ErrorHandler(object x, ErrorEventArgs error) 
{ 
    Console.WriteLine(error.ErrorContext.Error); 
    error.ErrorContext.Handled = true; 
} 

今、すべてのエラーは例外をスローしませんので、あなたはおそらく、最後の行でより多く行う必要があります。 Json.NETで例外を呼び出す

UPDATE

逆コンパイルコード形式は:

if (this.TraceWriter != null && this.TraceWriter.LevelFilter >= TraceLevel.Verbose) 
    this.TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, StringUtils.FormatWith("Could not find member '{0}' on {1}", (IFormatProvider) CultureInfo.InvariantCulture, (object) propertyName, (object) contract.UnderlyingType)), (Exception) null); 
if (this.Serializer.MissingMemberHandling == MissingMemberHandling.Error) 
    throw JsonSerializationException.Create(reader, StringUtils.FormatWith("Could not find member '{0}' on object of type '{1}'", (IFormatProvider) CultureInfo.InvariantCulture, (object) propertyName, (object) contract.UnderlyingType.Name)); 
reader.Skip(); 
+0

ない作品を行います。 JsonSerializationExceptionがスローされ、ErrorHandlerが省略されました。 – wishmaster

+0

フルコードはhttp://pastebin.com/zjztsZDxです。あなたのコードに問題がある場合 –

+0

ありがとう、ありがとう。 JSON.NETバージョン4.0の問題でした。バージョン5.0にアップデートしたとき、ErrorHandlerが呼び出されました。しかし、まだ私の質問の解決策はありません。未知のメンバーがエラーの原因であることをどのように知ることができますか?私は例外メッセージを持っています: "CarEntityのタイプのオブジェクトのメンバ 'マイレージ'を見つけることができませんでした..."しかし、メッセージの解析は受け入れられません。 – wishmaster

関連する問題