2013-04-12 23 views
6

Używam JSON do wymiany danych. Używam framework JSON.NET.JSON.NET: Obsługa nieznanych członków podczas deserializacji

mam klasę:

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

I mam następujący kod:

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

Ponieważ nie ma "Przebieg" pole w klasie CarEntity muszę logować się ostrzeżenie o tym:

Nieznane pole: przebieg = 35000

Czy jest jakiś sposób na zrobienie tego?

Odpowiedz

7

Jest to trochę trudne, ale można. Zmienić swój kod do:

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

I dodają:

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

należy prawdopodobnie zrobić więcej z ostatniej linii, ponieważ teraz każdy błąd nie wyjątek.

UPDATE

postaci kodu dekompilowana powołując wyjątek w Json.NET:

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

Czy nie działa. Wyrzucono wyjątek JsonSerializationException i błąd ErrorHandler został anulowany. – wishmaster

+0

Pełny kod jest tutaj: http://pastebin.com/zjztsZDx. Jeśli masz problemy, pokaż mi swój kod –

+0

OK, dziękuję. To był problem dla JSON.NET w wersji 4.0. Po aktualizacji do wersji 5.0 został wywołany ErrorHandler. Ale wciąż nie ma rozwiązania dla mojego pytania. Skąd mogę wiedzieć, że nieznany członek jest przyczyną błędu? Mam komunikat o wyjątku: "Nie można znaleźć elementu" Przebieg "na obiekcie typu" CarEntity "..." Ale wiadomość parsująca jest nie do zaakceptowania. – wishmaster

Powiązane problemy