Newtonsoft JSON序列化列表中的列表

时间:2017-02-15 17:27:20

标签: serialization json.net uwp entity-framework-core

我在我的UWP应用程序中使用了ef核心数据库,并且在序列化包含带有Newtonsoft JSON的列表的列表时出现了一些问题。

对于最小的示例,请考虑microsoft中的UWP教程,其中包含以下代码

with open (savethepaths,'w') as f:
    f.writelines(list("%s\n" %filepath for filepath in filepaths))

当我现在想要通过以下方式序列化某些数据时:

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); } 中收到System.StackOverflowException类型的错误,我输入了无限循环。正如用户alanh在评论中提到的,可以通过在mscorlib.ni.dll中将ReferenceLoopHandling设置为ReferenceLoopHandling.Ignore来解决此问题。

我希望在序列化博客时,只将每个帖子的JsonSerializerSettings存储为ID而不是List<int>

为什么要序列化,如果给出数据库?我想共享特定的数据库条目,需要序列化它们。此外,我考虑与List<Post>进行同步,因此在不同时间(单个用户)在不同设备上编辑不同的数据库条目时不会发生冲突。

1 个答案:

答案 0 :(得分:1)

将这行代码添加到Startup类中可以防止出现循环问题

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

然后,您可以将[JsonIgnore]属性用于您不希望序列化的所有属性。

或者您可以通过扩展JsonConverter类并实施自己的WriteJson, ReadJsonCanConvert方法来实现自己的序列化程序,如下所示:

implement your own serializer