Нулевой указатель при десериализации JSON в список - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь десериализовать JSON в список ReportVersandLogDtos с 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; }
}

К сожалению, я получаю исключение NullPointerException при вызове метода JsonSerializer.Deserialize.

Ссылка на объект не установлена ​​на экземпляр объекта.

Я не уверен, что я делаю неправильно ... не могли бы вы указать мне правильное направление?


Минимальный воспроизводимый пример:

(Это ядро ​​.netКонсольное приложение 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
        });
    }
}

1 Ответ

2 голосов
/ 06 ноября 2019

Похоже, вы смешиваете 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; }
}

Кроме того, нет необходимости объявлять строки как ссылочные типы со значением NULL (string?), если только вы не используете их в контексте NULL.

Пожалуйста, смотрите это скрипка .

...