如何使用Json.Net对嵌套对象进行de / serial化

时间:2014-07-20 12:31:13

标签: c# json json.net

我们说我有两个班,即人和项目:

class Person {
    public int Id { get; set; }
    public string Name { get; set; }
}

class Project {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Person> Workers { get; set; }
}

我想将人员数据和项目数据存储在名为person.json和project.json的单独文件中。

为了序列化数据我使用下面的语句:

JsonConvert.SerializeObject(Collection, Formatting.None, new JsonSerializerSettings()
    {
        NullValueHandling = NullValueHandling.Ignore,
        TypeNameHandling = TypeNameHandling.All
    };)

其中collection是List<People>

要反序列化人员数据,请使用以下语句:

JsonConvert.DeserializeObject<List<T>>(json, , new JsonSerializerSettings()
    {
        NullValueHandling = NullValueHandling.Ignore,
        TypeNameHandling = TypeNameHandling.All
    };)

其中json是来自person.json的字符串json数据。 我在ListBox中显示List<Person>

现在我不确定如何存储项目数据,以便每次编辑人物对象并最终将其保存到person.json文件时,List<Person>对象中的相应人物对象在项目文件中也更新。

我甚至不确定json是否是一个好的方法,也许我应该尝试关系数据库。

如果我没有很好地解释我的情况,请告诉我。我真的需要用json做这个工作并为我的问题寻找解决方案。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

您的问题并非真正针对序列化,而是针对数据的同步。如果您使用XML,文本文件或某些自定义二进制格式,请考虑一下您会遇到同样的问题。

由于您已将Person对象反规范化为Project对象,因此每次保存项目时,它都会拥有所有人员数据的完整副本。

一个选项是 not denormalize,而只是将PersonID列表放入Project对象。根据您的应用中哪个路径更突出,您还可以考虑在Person对象中添加ProjectID列表。换句话说,这种关系可以用任何一种方式表达。

无论如何,您需要管理数据。可能是您编写了一堆代码来从磁盘加载所有JSON文件并自行操作。可能是您将结构化数据映射到可以存储在SQL Server或MySQL等数据库中的关系模式。你可以使用像EntityFramwork或NHibernate这样的ORM来帮助它。或者,您可以使用其中一个NoSQL数据库,如RavenDB或MongoDB,或许多其他类似的项目。

换句话说 - 保持序列化和存储的思想分离。有时序列化涉及存储,但序列化也涉及传输,许多存储引擎以自己的自定义方式处理序列化。