将多对多关系序列化为JSON和回溯关系

问题描述 投票:1回答:1

我需要一些帮助。 Google和Json.net的文档都没有帮助。

这些是我的对象。

[JsonObject(IsReference = true)]
public class Member
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public virtual List<Dog> Dogs { get; set; }
}

[JsonObject(IsReference = true)]
public class Dog
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public virtual List<Member> members { get; set; }
}

一只狗可以有多个成员,而一个成员可以有多只狗,所以我为这两个对象创建了我的集合。

List<Member> members = new List<Member> { new Member { Id = 1, Naam = "James" } };
List<Dog> dogs = new List<Dog> { new Dog { Id = 2, Naam = "Fifi", members = new List<Member> { members[0] } } };
members[0].Dogs = new List<Dog> { dogs[0] };

在这一点上 members[0].Dogsdogs[0] 有相同的引用。

我想把列表保存到JSON中,但保留引用。 我试过这样做。

string jsonMembers = JsonConvert.SerializeObject(members, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
string jsonDogs = JsonConvert.SerializeObject(dogs, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });

和后退

members = JsonConvert.DeserializeObject<List<Member>>(jsonMembers, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
dogs = JsonConvert.DeserializeObject<List<Dog>>(jsonDogs, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });

如果我检查平等的 members[0].Dogsdogs[0] 同样,两者有不同的引用。 如何使两者反序列化后仍有相同的引用?

c# json json.net many-to-many
1个回答
1
投票

你是分别序列化deserializing dogs和成员,并且有两个JSON字符串,它们之间没有关系。

定义单个结构,其中包含狗和成员,并一次性serializedeserialize所有对象,deserialized结构应该有每个对象的单个实例。

public class Storage 
{
    public List<Dog> Dogs { get; set; }
    public List<Member> Members { get; set; }
}  


var json = JsonConvert.SerializeObject(storage, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });

var storage2 = JsonConvert.DeserializeObject<Storage>(json, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
© www.soinside.com 2019 - 2024. All rights reserved.