2013-04-12 18 views
6

Ich benutze JSON für den Datenaustausch. Und ich benutze JSON.NET Framework.JSON.NET: Unbekannte Mitglieder bei der Deserialisierung

Ich habe die Klasse:

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

Und ich habe folgenden Code:

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

Da es keine "Kilometerstand" Feld in CarEntity Klasse I log darüber warnen müssen:

Unbekanntes Feld: Kilometerstand = 35000

Gibt es einen Weg, es zu tun?

Antwort

7

Es ist ein wenig schwierig, aber Sie können. Ändern Sie Ihren Code:

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

Und fügen:

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

Sie sollten wahrscheinlich mehr mit der letzten Zeile tun, weil jetzt jeder Fehler wird nicht eine Ausnahme werfen.

UPDATE

dekompilierte Kodeform Ausnahme in Json.NET Aufruf:

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

nicht Werke tun. JsonSerializationException wurde ausgelöst und ErrorHandler wurde ausgelassen. – wishmaster

+0

Der vollständige Code ist hier: http://pastebin.com/zjztsZDx. Wenn Sie Probleme haben, zeigen Sie mir Ihren Code –

+0

Ok, danke. Es war ein Problem für JSON.NET Version 4.0. Wenn ich auf Version 5.0 aktualisiert habe, wurde ErrorHandler aufgerufen. Aber immer noch keine Lösung für meine Frage. Wie kann ich wissen, dass ein unbekanntes Mitglied ein Fehlergrund ist? Ich habe eine Ausnahmemeldung: "Ich konnte das Mitglied 'Mileage' für das Objekt vom Typ 'CarEntity' nicht finden ..." Aber das Parsen der Nachricht ist nicht akzeptabel. – wishmaster

Verwandte Themen