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

本文关键字:对象 创建 反序列化 Json | 更新日期: 2023-09-27 18:24:08

显示问题的模型比先解释更容易。

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表现得不重复?

希望这是有意义的

Steve

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

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

    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