JSON.NET:在反序列化时处理的未知成员

wis*_*ter 7 c# json json.net

我正在使用JSON进行数据交换.我正在使用JSON.NET框架.

我上课了:

public class CarEntity
{
    public string Model { get; set; }
    public int Year { get; set; }
    public int Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有以下代码:

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

由于CarEntity类中没有"里程"字段,因此需要对其进行日志警告:

未知字段:里程= 35000

有办法吗?

Pio*_*app 8

这有点棘手,但你可以.将您的代码更改为:

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

并添加:

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

你应该用最后一行做更多的事情,因为现在每个错误都不会引发异常.

UPDATE

在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();
Run Code Online (Sandbox Code Playgroud)