将 json 反序列化为列表时的空指针
Nullpointer when deserializing json to a list
我正在尝试将 JSON 反序列化为具有 System.Text.Json.JsonSerializer
的 ReportVersandLogDtos 列表
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。
Object reference not set to an instance of an object.
我不确定我做错了什么......你能给我指出正确的方向吗?
最小可重现示例:
(这是一个 .net core 3.0 控制台应用程序)
我已经在上面发布了整个 ReportVersandLogDto(它使用 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
之间不可互换。尝试将您的 class 更新为以下内容:
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?
) 类型。
请看这个fiddle。
我正在尝试将 JSON 反序列化为具有 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。
Object reference not set to an instance of an object.
我不确定我做错了什么......你能给我指出正确的方向吗?
最小可重现示例:
(这是一个 .net core 3.0 控制台应用程序)
我已经在上面发布了整个 ReportVersandLogDto(它使用 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
之间不可互换。尝试将您的 class 更新为以下内容:
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?
) 类型。
请看这个fiddle。