c# - 将 json 反序列化为列表时的空指针
问题描述
我正在尝试将 JSON 反序列化为 ReportVersadLogDtos 列表System.Text.Json.JsonSerializer
var reportVersandLogsAsync = JsonSerializer.Deserialize<List<ReportVersandLogDto>>(content, new JsonSerializerOptions {
PropertyNameCaseInsensitive = true,
IgnoreNullValues = true
});
内容如下所示:
[
{
"AnzahlArtikel": 6,
"Betreff": "Cupra Daily News",
"ReportId": 379717,
"ReportVersandLogId": 4244138,
"VersendetAm": "2019-11-02T06:30:15.997",
"Link": "foo"
}
]
ReportVersandLogDto 如下所示:
[JsonObject]
public class ReportVersandLogDto : IResource
{
[JsonProperty("anzahlArtikel")]
public long AnzahlArtikel { get; set; }
[JsonProperty("betreff")]
public string? Betreff { get; set; }
[JsonProperty("hasBeenRead")]
public bool HasBeenRead { get; set; }
[JsonProperty("reportId")]
public long ReportId { get; set; }
[JsonProperty("reportVersandLogId")]
public long ReportVersandLogId { get; set; }
[JsonProperty("versendetAm")]
public string? VersendetAm { get; set; }
//[JsonProperty("link")]
//public string? Link { get; set; }
}
JsonSerializer.Deserialize
不幸的是,在调用该方法时我得到了 NullPointerException 。
你调用的对象是空的。
我不确定我做错了什么......你能指出我正确的方向吗?
最小的可重现示例:
(这是一个 .net core 3.0 控制台应用程序)
我已经在上面发布了整个 ReportVersadLogDto(它使用来自 Newtonsoft.Json 的属性)
class Program
{
static void Main(string[] args)
{
var content = "\"[{\\\"AnzahlArtikel\\\":6,\\\"Betreff\\\":\\\"Cupra Daily News\\\",\\\"ReportId\\\":379717,\\\"ReportVersandLogId\\\":4244138,\\\"VersendetAm\\\":\\\"2019-11-02T06:30:15.997\\\",\\\"Link\\\":\\\"foo\\\"}]\"";
var reportVersandLogsAsync = JsonSerializer.Deserialize<List<ReportVersandLogDto>>(content, new JsonSerializerOptions {
PropertyNameCaseInsensitive = true,
IgnoreNullValues = true
});
}
}
解决方案
看起来你正在混合Newtonsoft.Json
和System.Text.Json
。
JsonProperty
在 Newtonsoft 中使用。
JsonPropertyName
是 中的等价物System.Text.Json
。
Newtonsoft.Json
这些属性在和之间不可互换System.Text.Json
。尝试将您的课程更新为以下内容:
public class ReportVersandLogDto
{
[JsonPropertyName("anzahlArtikel")]
public long AnzahlArtikel { get; set; }
[JsonPropertyName("betreff")]
public string Betreff { get; set; }
[JsonPropertyName("hasBeenRead")]
public bool HasBeenRead { get; set; }
[JsonPropertyName("reportId")]
public long ReportId { get; set; }
[JsonPropertyName("reportVersandLogId")]
public long ReportVersandLogId { get; set; }
[JsonPropertyName("versendetAm")]
public string VersendetAm { get; set; }
[JsonPropertyName("link")]
public string Link { get; set; }
}
此外,无需将字符串声明为可空引用 ( string?
) 类型,除非您在可空上下文中使用它们。
请看这个小提琴。
推荐阅读
- asp.net-core - 多租户 Azure 托管的 ASP.NET Core 2.1 Web Api 上的字段级权限缓存
- python - 如何模拟 Pytest 的库类
- php - Codeigniter - Sql 数据库
- google-bigquery - 尝试在标准 SQL BigQuery 中使用 CAST 将十六进制时间戳转换为十进制
- regex - 至少 5 个字符但没有前导或尾随空格的 html 模式
- ember.js - {{#link-to}} 破坏语义 UI
- laravel - vue 应用程序中的路由器视图和组件(laravel)
- c# - 如何处理微服务中的表连接
- spring - Spring Boot Security 自定义登录页面
- javascript - api请求不工作节点