use*_*249 6 c# serialization json exception
C#异常是可序列化的,因此它们也不能同时是DataContracts,因此我不能使用JsonDataContractSerializer。
有什么方法可以将Exceptions序列化为JSON?
Joh*_*ens 18
由于这还没有真正得到回答:只需创建一个包含您想要的错误属性的字典,使用 JSON.NET 将其序列化并将其放入HttpResponseMessage:
catch (Exception e)
{
var error = new Dictionary<string, string>
{
{"Type", e.GetType().ToString()},
{"Message", e.Message},
{"StackTrace", e.StackTrace}
};
foreach (DictionaryEntry data in e.Data)
error.Add(data.Key.ToString(), data.Value.ToString());
string json = JsonConvert.SerializeObject(error, Formatting.Indented);
HttpResponseMessage response = new HttpResponseMessage();
response.Content = new StringContent(json);
return response;
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助一些人。
这是我在项目中使用的解决方案,它有一些期望的优点(恕我直言):
using System.Text.Json.Serialization;
namespace MyAwesomeroject.Shared.Utils;
public static class ExceptionExtensions
{
public class ExceptionInfo
{
public ExceptionInfo() { }
internal ExceptionInfo(Exception exception, bool includeInnerException = true, bool includeStackTrace = false)
{
if (exception is null)
{
throw new ArgumentNullException(nameof(exception));
}
Type = exception.GetType().FullName;
Message = exception.Message;
Source = exception.Source;
StackTrace = includeStackTrace ? exception.StackTrace : null;
if (includeInnerException && exception.InnerException is not null)
{
InnerException = new ExceptionInfo(exception.InnerException, includeInnerException, includeStackTrace);
}
}
public string Type { get; set; }
public string Message { get; set; }
public string Source { get; set; }
public string StackTrace { get; set; }
public ExceptionInfo InnerException { get; set; }
}
private static readonly JsonSerializerOptions _defaultJsonSerializerOptions = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
WriteIndented = true,
};
/// <summary>
/// Serialize the <see cref="Exception"/> to a JSON string.
/// </summary>
/// <param name="ex">The exception</param>
/// <param name="includeInnerException">Control if to include inner exception</param>
/// <param name="includeStackTrace">Control if to include stack trace</param>
/// <param name="options">JSON options. By default nulls are not serialized and the string is indented</param>
/// <returns></returns>
public static string ToJson(
this Exception ex,
bool includeInnerException = true,
bool includeStackTrace = false,
JsonSerializerOptions options = null)
{
ArgumentNullException.ThrowIfNull(ex);
var info = new ExceptionInfo(ex, includeInnerException, includeStackTrace);
return JsonSerializer.Serialize(info, options ?? _defaultJsonSerializerOptions);
}
}
Run Code Online (Sandbox Code Playgroud)
产生这样的输出:
{
"Type": "System.InvalidOperationException",
"Message": "MyMessage",
"Source": "MySource",
"InnerException": {
"Type": "System.ArgumentException",
"Message": "MyInnerMessage",
"Source": "MyAwesomeProject.Utils.Tests",
"StackTrace": " at MyAwesomeProject.Utils.Tests.ExceptionExtensionsTests.ShouldInclude_StackTrace_if_required() in /Users/jc/git/MyAwesomeProject/tests/Shared/Utils/ExceptionExtensionsTests.cs:line 41"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7081 次 |
| 最近记录: |