JSON值无法转换为系统.集合.通用.列表

qcbq4gxm  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(202)

我正在使用一个以JSON响应返回的API。我正在尝试使用System.Text.Json将JSON响应反序列化为一个类。我收到了一个JsonException,可以帮助我理解我做错了什么。
我调用API并存储JSON响应:

var response = await client.PostAsJsonAsync(url, responseValue);
string ApiResponse = await response.Content.ReadAsStringAsync();``

下面是控制台WriteLine(ApiResponse)的输出:

{"matches":\[\],"nomatches":\[{"Id":"1111111111"},{"Id":"222222222"},{"Id":"33333333333"}\],"notfound":\[{"Id":"4444444"},{"Id":"5555555555"}\]}

我有以下的类结构:

public class JsonResp
{
    public class Rootobject
    {
        [JsonPropertyName("matches")]
        public Match[] Matches { get; set; }
        //public List<Match> Matches { get; set; }
        [JsonPropertyName("nomatches")]
        //public List<Nomatch> Nomatches { get; set; }
        public Nomatch[] Nomatches { get; set; }
        [JsonPropertyName("notfound")]
        public Notfound[] Notfound { get; set; }
        //public List<Notfound> Notfound { get; set; }
        [JsonPropertyName("id")]
        public object id { get; set; }
    }

    public class Match
    {
        public string id { get; set; }
    }

    public class Nomatch
    {
        public string id { get; set; }
    }

    public class Notfound
    {
        public string id { get; set; }
    }
}


我在努力...

List<Rootobject>? result = JsonSerializer.Deserialize<List<Rootobject>>(ApiResponse);

抛出JsonException:JSON值无法转换为系统.集合.通用.列表“1[测试.模型.响应.JsonResp+根对象]。路径:$|行号:0|行内字节位置:一、

我哪里做错了?

iyr7buue

iyr7buue1#

图中的JSON表示一个对象,但我们试图将其反序列化为一个对象列表:

List<Rootobject>? result= JsonSerializer.Deserialize<List<Rootobject>>(ApiResponse);

它不是一个列表。它是一个对象:

Rootobject? result= JsonSerializer.Deserialize<Rootobject>(ApiResponse);
g0czyy6m

g0czyy6m2#

你必须修改你的API响应json字符串。例如,应该用“]”代替“/]”。你可以使用字符串函数来实现

ApiResponse = ApiResponse.Replace("\\]","]").Replace("\\[","[");

在此之后,您将反序列化json,但使用Rootobject而不是collection

Rootobject? result = System.Text.Json. JsonSerializer.Deserialize<Rootobject?>(ApiResponse );

你也需要修正这些类

public class Match
    {
        [JsonPropertyName("Id")]
        public string id { get; set; }
    }

    public class Nomatch
    {
        [JsonPropertyName("Id")]
        public string id { get; set; }
    }

    public class Notfound
    {
    [JsonPropertyName("Id")]
        public string id { get; set; }
    }

恕我直言,如果每个类中只有一个属性ID,那么一个类就足够了,而不是几个。另外,如果添加jsonOptions,可以删除所有JsonPropertyName属性

var jsonOptions = new System.Text.Json.JsonSerializerOptions
 { PropertyNameCaseInsensitive = true };
    
Rootobject? result= System.Text.Json. 
JsonSerializer.Deserialize<Rootobject?>(ApiResponse,jsonOptions );

相关问题