Я зарегистрировал ошибку, но это похоже на такой базовый фундаментальный сценарий, что я, должно быть, что-то упускаю: Ошибка: https://github.com/dotnet/runtime/issues/48202

Я не могу десериализовать DateTime, Guid или Enum с помощью System.Text.Json.

Вот очень минимальный тест XUnit, чтобы воспроизвести, как я ожидал, что он будет работать, но он не работает.

using System;
using System.Text.Json;
using Xunit;

namespace Example.Tests
{
    public class UnitTest1
    {
        [Fact]
        public void GuidsAndDateTimesNotSerialized()
        {
            var post = new Post {
                AuthorId = Guid.NewGuid(),
                Created = DateTime.UtcNow,
                Title = "test title",
                Path = "test-title",
                PostStatus = PostStatus.Published,
                Description = "this is a test",

            };
            var json = JsonSerializer.Serialize(post);
            var result = JsonSerializer.Deserialize<Post>(json);

            Assert.Equal(post.Created, result.Created);
            Assert.Equal(post.AuthorId, result.AuthorId);
            Assert.Equal(post.PostStatus, result.PostStatus);
        }
    }

    public class Post
    {
        public Guid AuthorId { get; internal set; }
        public string Title { get; set; }
        public string Path { get; set; }
        public string Description { get; set; }
        public PostStatus PostStatus { get; internal set; }
        public DateTime Created { get; internal set; }
    }

    public enum PostStatus
    {
        Draft,
        Published
    }
}

Есть ли что-то с использованием System.Text.Json, чего мне не хватает?

0
Matt Sanders 12 Фев 2021 в 04:02

1 ответ

Лучший ответ

Я предполагаю, что ваши свойства, установленные с помощью internal, недоступны для библиотеки / сборки JSON. Просто измените их на установщики public (удалите модификатор доступа internal) и попробуйте снова.

JSON DTO должны быть простыми классами и всегда иметь конструктор по умолчанию:

public class Post
{
    public Guid AuthorId { get; set; }
    public string Title { get; set; }
    public string Path { get; set; }
    public string Description { get; set; }
    public PostStatus PostStatus { get; set; }
    public DateTime Created { get; set; }
}
2
T McKeown 12 Фев 2021 в 01:14