【问题标题】:Is there a way to serialize embeded objects using json.net有没有办法使用 json.net 序列化嵌入式对象
【发布时间】:2013-01-18 21:52:12
【问题描述】:

我正在尝试使用 JSON.Net 模拟外键行为,但我似乎无法找到获得真实引用的方法。

假设我有一个简单的例子:

private static void Main(string[] args)
        {
            var g1 = new Group {Name = "g1"};
            var g2 = new Group {Name = "g2"};

            var users = new[]
            {
                new User{ Username = "truc", Group = g1 },
                new User{ Username = "machin", Group = g2 },
                new User{ Username = "dom", Group = g2 },
                new User{ Username = "boum", Group = g2 }
            };

            string json = JsonConvert.SerializeObject(users);

            var jsonUsers = JsonConvert.DeserializeObject<User[]>(json);

            Console.WriteLine(jsonUsers[2].Group == jsonUsers[3].Group);

            Console.ReadLine();
        }

这里的问题是Console.WriteLine(jsonUsers[2].Group == jsonUsers[3].Group); 总是假的。

我发现使它起作用的唯一方法是存储用户列表,然后是组列表并在用户内部具有 GroupId 属性。然后在所有内容都反序列化后,我手动在用户内部插入组的引用。这很骇人听闻。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 您关于使用标识符链接模型的建议也是 I4V 提供的答案的有效方法,特别是如果序列化内容要传播到另一个接口,比如作为 RESTful Web 服务的结果.
  • 另外,如果您使用 Resharper,它提供了一个上下文操作来覆盖您应该真正使用的相等成员,因为它提供了 I4V 帖子的更好替代方案。

标签: c# .net serialization foreign-keys json.net


【解决方案1】:

您正在进行实例比较。您应该在 Group 类中覆盖 EqualsGetHashcode。运算符重载也很好,因为您在 Console.WriteLine 中使用 == 运算符

否则;

new Group() { Name = "a" } == new Group() { Name = "a" }

new Group() { Name = "a" }.Equals(new Group() { Name = "a" })

总是会返回 false

.

public class Group
{
    public string Name;
    public int i;


    public static bool operator ==(Group a, Group b)
    {
        return a.Equals(b);
    }

    public static bool operator !=(Group a, Group b)
    {
        return !(a.Name == b.Name);
    }

    public override bool Equals(object obj)
    {
        var g = obj as Group;
        if (ReferenceEquals(this,g)) return true;
        return g.Name.Equals(Name);
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
}

【讨论】:

  • 好主意,非常整洁。我会调查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多