反序列化 .NET HealthReport 对象

问题描述 投票:0回答:2

我正在尝试将 HTTP 响应消息反序列化为

HealthReport
对象。但是,
Newtonsoft
System.Text.Json
都不支持反序列化为类型,因为不能是无参数构造。

由于

HealthReport
是 ASP.NET Core 在健康检查方面广泛使用的类型,因此我认为无需复杂的自定义
JsonConvert
函数即可进行反序列化。但我似乎无法让它发挥作用。

我调用一个端点,它返回一个 HttpResponseMessage,我知道它只包含一个 HealthReport。 我对该响应调用 ReadAsStringAsync() 。我尝试使用 NewtonSoft 和 System.Text.Json 进行反序列化,但两者都抛出不支持转换的异常,因为 HealtReport 不支持无参数构造。

是否有人有经验或建议来轻松反序列化内容,我必须手动编写自定义 JsonConverter 才能达到我想要的结果?

c# json .net asp.net-core
2个回答
0
投票

我收到了一些很好的建议。 我最终利用自定义转换器并使用动态类型作为反序列化的目标类型,然后在 foreach 循环中迭代每个属性并将它们映射到合适的类型,并根据映射的属性实例化一个新的 HealthReport 对象。


0
投票

我也有同样的问题。 HealthReport 类是密封的,没有空参数构造函数,并且其属性只有 get 方法。没有什么利于反序列化。

在对将 http 响应作为不可反序列化的“application/json”发送进行抱怨之后:我构建了一个实用程序类来促进反序列化,然后使用 ToHealthReport 方法来获取 HealthReport 对象。

public class SerializableHealthReport {

    public Dictionary<string HealthReportEntry> Entries { get; set; }
    public HealthStatus Status { get; set; }
    public TimeSpan TotalDuration { get; set; }

    public SerializableHealthReport()
    {
    }

    public HealthReport ToHealthReport()
    {
        return new HealthReport(Entries, Status, TotalDuration);
    }
}

反序列化示例:

public HealthReport DeserializeHealthResponse(string httpResponseContent)
{
    var serializableHealthReport =
        JsonSerializer.Deserialize<SerializableHealthReport>(content);

    return serializableHealthReport.ToHealthCheck();

}

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.