Json反序列化,创建重复对象

4

展示问题的模型比先试图解释问题更容易。

internal class Program
{
    private static void Main(string[] args)
    {
        Class1 class1 = new Class1() { Name = "Scott" };
        Class2 class2 = new Class2() { Name = "Steve", Objects = new List<Class1>() { class1 } };
        Class2 class22 = new Class2() { Name = "Atanas", Objects = new List<Class1>() { class1 } };

        List<Class2> list = new List<Class2>() { class2, class22 };
        string jSonString = JsonConvert.SerializeObject(list,Formatting.Indented,
                                    new JsonSerializerSettings()
                                        {
                                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                                        });


        List<Class2> result = (List<Class2>) JsonConvert.DeserializeObject(jSonString, typeof(List<Class2>));

        if (result[0].Objects[0] == result[1].Objects[0])
        {
            Console.WriteLine("Correct, its the same object");
        }
        else
        {
            Console.WriteLine("Bah!, its a new object");
        }
    }
}

public class Class1
{
    public string Name { get; set; }
}

public class Class2
{
    public Class2()
    {
        Objects = new List<Class1>();
    }

    public List<Class1> Objects { get; set; }
    public string Name { get; set; }
}

问题在于当字符串反序列化时,“共享对象”现在被复制了。在序列化之前,同一对象(通过引用)在两个不同的列表中。反序列化后,两个列表都包含单独的对象。
有没有可能让json不重复呢?
希望这样说得清楚。
史蒂夫
1个回答

3

是的,如果您按照以下方式设置您的序列化器:

    JsonSerializerSettings settings = new JsonSerializerSettings
    {
        PreserveReferencesHandling = PreserveReferencesHandling.All
    };

JSON字符串将是:

{
  "$id": "1",
  "$values": [
    {
      "$id": "2",
      "Objects": {
        "$id": "3",
        "$values": [
          {
            "$id": "4",
            "Name": "Scott"
          }
        ]
      },
      "Name": "Steve"
    },
    {
      "$id": "5",
      "Objects": {
        "$id": "6",
        "$values": [
          {
            "$ref": "4"
          }
        ]
      },
      "Name": "Atanas"
    }
  ]
}

你会在控制台看到:

没错,这是同一个对象

请参考http://james.newtonking.com/projects/json/help/index.html?topic=html/T_Newtonsoft_Json_PreserveReferencesHandling.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接