在 Refit 请求方法上应用 JsonConverter 属性

Apply JsonConverter attribute on Refit request method

提问人:Gabboxl 提问时间:10/16/2023 最后编辑:dbcGabboxl 更新时间:10/16/2023 访问量:52

问:

我正在使用 Refit 库开发一个 UWP 应用,以向返回 JSON 数据的 API 发出 HTTP 请求。

我有一个自定义的JsonConverter类。NoteDeserializerNet : JsonConverter<List<Note>>

我以以下方式在另一个类模型上使用该 JsonConverter 类:

    public class OverviewResult
    {
        [JsonPropertyName("lessons")]
        public List<Lesson> Lessons { get; set; }

        [JsonPropertyName("notes")]
        [System.Text.Json.Serialization.JsonConverter(typeof(NoteDeserializerNet))]
        public List<Note> NotesResult { get; set; }
    }

在这种情况下,我在与 API 的 json 响应上的“notes”对象相对应的属性上使用该 JsonConverter。


我有另一个API端点,它直接返回相同的注释列表,但作为json响应的对象。

以下是使用 .NET Refit 库从 API 获取数据的方法:

[Get("/students/{userId}/notes/all")]
Task<List<Note>> GetAllNotes(string userId);

我尝试像这样在方法上应用 JsonConverter,但不支持:

[Get("/students/{userId}/notes/all")]
[System.Text.Json.Serialization.JsonConverter(typeof(NoteDeserializerNet))]
Task<List<Note>> GetAllNotes(string userId);

我知道我可以使用 RefitSettings 类为每个请求设置要使用的 JsonConverter,但我需要一个灵活而简单的解决方案,就像第一个示例一样。可能使用属性。


我还尝试创建一个类,该类是该类型的子集:List<Note>

[System.Text.Json.Serialization.JsonConverter(typeof(NoteDeserializerNet))]
public class NotesResult : List<Note>
{}

但它仍然不适用于这两种情况,因为我必须从我的自定义类中返回一个对象而不是一个通用对象。NotesResultList<Note>NoteDeserializerNet

我还试图找到一种方法将类内部的属性设置为“根”json路径,以便我可以使用该属性,但显然没有一种简单直接的方法可以做到这一点。JsonConverter

public class NotesResult
{
    //how can I set that property to be seen by the deserializer as the "root" json path?
    [System.Text.Json.Serialization.JsonConverter(typeof(NoteDeserializerNet))]
    public List<Note> Notes { get; set; }
}

如何以最少的代码以简单的方式将 JsonConverter 直接应用于一个 Refit 方法 API 调用?

C# JSON System.Text.json 改装

评论

0赞 dbc 10/17/2023
与其子类化,不如创建一个自定义装饰器来包装您的装饰器并应用于它。在此处查看演示控制台应用:dotnetfiddle.net/VS2a5u。这能达到你想要的效果吗?List<Note>IEnumerable<Note>List<Note>NoteDeserializerNet
0赞 dbc 10/17/2023
或者,为什么在构造 SystemTextJsonContentSerializer 时不想添加 to?有没有一种情况,你要退回一个,你不想使用?另外,您能分享一下是什么吗?为 a(而不是项目类型)设置转换器有点不寻常。NoteDeserializerNetJsonSerializerOptionsList<Note>NoteDeserializerNetNoteDeserializerNetList<T>T

答: 暂无答案