在使用System.Text.Json时,将JSONElement的数组反序列化回具体列表不工作 &



我在反序列化对象时遇到了一个问题。对象有一个属性(data),它是JSONElement的列表。我在做:

using var doc = JsonDocument.Parse(JsonSerializer.Serialize(result));
var e = doc.RootElement.GetProperty("data");
var data = JsonSerializer.Deserialize<List<MyItem>>(e);

序列化的result变量包含以下内容:

{
"data":[
{
"id":245,
"number":14,
"name":"Test"
}
],
"totalCount":-1,
"groupCount":-1,
"summary":null
}

MyItem类如下:

public class MyItem
{
public int Id { get; set; }
public int Number { get; set; }
public string Name { get; set; }
}

data变量是包含x项的列表。但是,所有项都是空实例。

我做错了什么?

问题可能是您的数据使用了小写的属性名,这些属性名没有通过默认的反序列化设置转换为类中的属性名。

using System.Text.Json;
dynamic result = new
{
data = new dynamic[] {
new {
id = 245,
number = 14,
name = "Test"
}
},
totalCount = -1,
groupCount = -1
};
using var doc = JsonDocument.Parse(JsonSerializer.Serialize(result));
var e = doc.RootElement.GetProperty("data");
List<MyItem> data = JsonSerializer.Deserialize<List<MyItem>>(e);
Console.WriteLine($"{data.First().Id} {data.First().Number} {data.First().Name}");

上面的代码不能与你的MyItem类一起工作,但是试试这个:

public class MyItem
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("number")]
public int Number { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
}

如果它有效,要么在所有属性上使用JsonPropertyName,要么考虑更改反序列化选项。

一切都可以在一串代码中完成。您只需要设置JsonSerializerOptions的PropertyNameCaseInsensitive = true。最好把它放在启动文件中。

List<MyItem> data =  JsonDocument.Parse(json).RootElement.GetProperty("data")
.Deserialize<List<MyItem>>();