2013-04-12 19 views
6

Veri alışverişi için JSON kullanıyorum. Ve JSON.NET framework kullanıyorum.JSON.NET: Serileştirme işleminde bilinmeyen üyeler

Ben sınıf var:

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

Ve şu var kod:

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

bu konuda uyarı log ihtiyaç CarEntity sınıfında hayır "Verim" alanı olduğundan:

Bilinmeyen alan: Kilometre = 35000

Bunu yapmanın bir yolu var mı?

cevap

7

Bu biraz zor ama yapabilirsiniz.

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

Ve ekleyin:: kodunuzu değiştirin

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

Muhtemelen son satırı ile daha yapmalıyım, artık her hata bir istisna olmayacaktır çünkü. Json.NET içinde istisna yürütmesini

GÜNCELLEME

bozulamaz kod formu:

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

değil işleri yapın. JsonSerializationException atıldı ve ErrorHandler ommitti. – wishmaster

+0

Tam kod burada: http://pastebin.com/zjztsZDx. Eğer sorun varsa bana kodunuzu göster –

+0

Tamam, teşekkür ederim. JSON.NET sürüm 4.0 için sorun oldu. 5.0 sürümüne güncellediğimde ErrorHandler çağrıldı. Ama yine de soruma bir çözüm yok. Bilinmeyen üyenin bir hata nedeni olduğunu nasıl bilebilirim? Özel durum mesajım var: "CarEntity" türünde nesne 'Kilometre' bulunamadı ... "Ama ayrıştırma mesajı kabul edilemez. – wishmaster