在 JSON.NET 数据解析期间忽略解析错误

我有一个具有预定义数据结构的对象:

public class A
{
public string Id {get;set;}
public bool? Enabled {get;set;}
public int? Age {get;set;}
}

而 JSON 应该是

{ "Id": "123", "Enabled": true, "Age": 23 }

我希望以积极的方式处理 JSON 错误,并且每当服务器为定义的数据类型返回意外值时,我希望忽略它并设置默认值(null)。

现在,当 JSON 部分无效时,我得到了 JSON 阅读器异常:

{ "Id": "123", "Enabled": "NotABoolValue", "Age": 23 }

我什么都没看到。 我想要的是一个物体:

new A() { Id = "123", Enabled = null, Age = 23 }

以及解析警告(如果可能的话)。 有可能用 JSON.NET 完成吗?

46845 次浏览

若要能够处理反序列化错误,请使用以下代码:

var a = JsonConvert.DeserializeObject<A>("-- JSON STRING --", new JsonSerializerSettings
{
Error = HandleDeserializationError
});

其中 HandleDeserializationError是下列方法:

public void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
{
var currentError = errorArgs.ErrorContext.Error.Message;
errorArgs.ErrorContext.Handled = true;
}

只要 json 字符串中有错误,就会调用 HandleDeserializationError。导致错误的属性将不会被初始化。

和伊利亚的解决方案一样,只不过是为懒人/匆忙之人准备的一句俏皮话(这要归功于他)

var settings = new JsonSerializerSettings { Error = (se, ev) => { ev.ErrorContext.Handled = true; } };
JsonConvert.DeserializeObject<YourType>(yourJsonStringVariable, settings);

支持果酱,因为它使它更短 =)

还有一个办法。例如,如果您正在使用一个使用 newtonjson 并为您执行反序列化和序列化的 nuget 包。如果包没有处理错误,则可能会出现此问题。那么你不能使用上面的解决方案。需要在对象级别进行处理。这里变成 一个错误属性有用。因此,下面的代码将捕获任何属性的任何错误,您甚至可以在 OnError 函数中进行修改并分配默认值

public class PersonError
{
private List<string> _roles;


public string Name { get; set; }
public int Age { get; set; }


public List<string> Roles
{
get
{
if (_roles == null)
{
throw new Exception("Roles not loaded!");
}


return _roles;
}
set { _roles = value; }
}


public string Title { get; set; }


[OnError]
internal void OnError(StreamingContext context, ErrorContext errorContext)
{
errorContext.Handled = true;
}
}

https://www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm