首页 > 解决方案 > 将 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
        });
    }
}

标签: c#.netjson.net-core-3.0

解决方案


看起来你正在混合Newtonsoft.JsonSystem.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?) 类型,除非您在可空上下文中使用它们。

请看这个小提琴


推荐阅读