gpt4 book ai didi

asp.net-core - 从 Json.Net 中的 JsonReaderException 中查找无效值

转载 作者:行者123 更新时间:2023-12-04 10:59:47 24 4
gpt4 key购买 nike

我正在运行下面的代码来故意抛出 JsonReaderException。它正确地给出了“无法将字符串转换为 bool 值:aaa。路径‘事件’,第 3 行,位置 17”的异常消息。

有什么方法可以直接从 JsonReaderException 获取验证失败的值,这样我就不必解析异常消息了吗?

string json = @"{
'Email': 'james@example.com',
'Active': 'aaa',
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
'User',
'Admin'
]
}";

try
{
Account account = JsonConvert.DeserializeObject<Account>(json);
Console.WriteLine(account.Email);
}
catch (JsonReaderException exc)
{
// Do Something
}

最佳答案

似乎有问题的值没有保存为 JsonReaderException 中的属性。 .此值唯一可能的位置是 Exception.Data 字典,但是 Json.NET 没有在这里添加任何内容。

但是,通过一些工作,您可以利用 Json.NET 的 serialization error event handling在抛出异常时直接访问错误值的功能。首先,定义以下辅助方法和 ErrorEventArgs 亚型:

public class ErrorAndValueEventArgs : Newtonsoft.Json.Serialization.ErrorEventArgs 
{
public object ReaderValue { get; } = null;

public ErrorAndValueEventArgs(object readerValue, object currentObject, ErrorContext errorContext) : base(currentObject, errorContext)
{
this.ReaderValue = readerValue;
}
}

public static partial class JsonExtensions
{
public static TRootObject Deserialize<TRootObject>(string json, EventHandler<ErrorAndValueEventArgs> error, JsonSerializerSettings settings = null)
{
using (var sr = new StringReader(json))
using (var jsonReader = new JsonTextReader(sr))
{
var serializer = JsonSerializer.CreateDefault(settings);
serializer.Error += (o, e) => error(o, new ErrorAndValueEventArgs(jsonReader.Value, e.CurrentObject, e.ErrorContext));
return serializer.Deserialize<TRootObject>(jsonReader);
}
}
}

现在您将能够访问 JsonReader.Value 的值在抛出异常时:
object errorValue = null;
try
{
Account account = JsonExtensions.Deserialize<Account>(json, (o, e) => errorValue = e.ReaderValue);
Console.WriteLine(account.Email);
}
catch (JsonException exc)
{
// Do Something
Console.WriteLine("Value at time of {0} = {1}, Data.Count = {2}.", exc.GetType().Name, errorValue, exc.Data.Count);
// Prints Value at time of JsonReaderException = aaa, Data.Count = 0.
}

笔记:
  • 由于您必须手动创建自己的 JsonTextReader ,您将需要访问 JSON 字符串(或 Stream )才能使用此方法。 (这在您的问题中显示的示例中是正确的。)
  • JsonSerializationException Parsing 中显示了用于捕获附加错误信息的类似技术。 .
  • 您可能想要增强 ErrorAndValueEventArgs还要记录 JsonReader.TokenType .如果在抛出异常时读取器位于容器(对象或数组)的开头,JsonReader.Value将为空。

  • 演示 fiddle here .

    关于asp.net-core - 从 Json.Net 中的 JsonReaderException 中查找无效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58895039/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com