使用 GetJsonAsync 获取元组列表

Jun*_*aid 1 c# json.net asp.net-core asp.net-core-webapi blazor

我正在开发 Blazor 应用程序。我有一个 API 方法,它返回一个List<Tuple<string,int>>.

Postman 中的 API 响应:

[
    {
        "Item1": "1",
        "Item2": 1
    },
    {
        "Item1": "24",
        "Item2": 2
    }
]
Run Code Online (Sandbox Code Playgroud)

剃刀页面中的 API 调用:

private object dataSource;

protected override async Task OnInitializedAsync() {
    dataSource = await Http.GetJsonAsync<List<Tuple<string,int>>>("/Api/Default/GetProjectsList");
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

Deserialization of reference types without parameterless constructor is not supported.
Run Code Online (Sandbox Code Playgroud)

我理解错误。

是否有可以解析的泛型类型GetJsonAsync也可以从 API 方法返回?

或者有没有办法解析这个元组?请帮我。

itm*_*nus 5

这是使用新的System.Text.Json. 看官方文档

不支持对没有无参数构造函数的引用类型进行反序列化。

由于Tuple<string,int>没有无参数构造函数,所以它失败了。

作为一种解决方法,您可以使用Newtonsoft.Json目前的经典反序列化元组:

var resp = await Http.GetStringAsync("/Api/Default/GetProjectsList");
var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Tuple<string,int>>>(resp);



foreach(var i in list){
    Console.WriteLine("--------");
    Console.WriteLine(i.Item1);
    Console.WriteLine(i.Item2);
    Console.WriteLine("--------");
}
Run Code Online (Sandbox Code Playgroud)