Newtonsoft JSON序列化列表中的列表

entity-framework-core json.net serialization uwp

我在我的UWP應用程序中使用ef核心數據庫,並且在序列化包含帶有Newtonsoft JSON的列表的列表時遇到了一些問題。

有關最小示例,請參閱Microsoft的UWP教程,其中包含以下代碼

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Post { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Filename=minexample.db");
    }
}

當我現在想要按以下方式序列化一些數據時:

using (var db = new BloggingContext())
{
    var dbPost = db.Blogs.Include(x => x.Post).ToList();
    var serialized = JSONClass.Serialize(dbPost);
}

我在進入無限循環的mscorlib.ni.dll中收到System.StackOverflowException類型的錯誤。由於用戶alanh在評論中提到的,這種行為可以固定設置ReferenceLoopHandlingReferenceLoopHandling.IgnoreJsonSerializerSettings

我希望在序列化博客時只將每個帖子的ID存儲為List<int>而不是List<Post>

為什麼要序列化,如果給出數據庫?我想共享特定的數據庫條目,需要序列化它們。此外,我考慮將此與OneDrive同步,因此在不同時間(單個用戶)在不同設備上編輯不同的數據庫條目時不會發生衝突。

熱門答案

將這行代碼添加到Startup類中可以防止出現循環問題

 services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

然後,您可以將[JsonIgnore]屬性用於您不希望序列化的所有屬性。

或者,您可以通過擴展JsonConverter類並實現自己的WriteJson, ReadJsonCanConvert方法來實現自己的序列化WriteJson, ReadJson如下所示:

實現自己的序列化程序



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow