读取JSON文件会将项添加到同一类的另一个属性的列表中

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

我有一组类如下:

public class Class1 : IClass
{
    public List<Class2> Class2List { get { return Class3Instance.Class2List; } }

    public Class3 Class3Instance { get; set; }
}

public class Class2
{
    public string Field1 { get; set; }
    public int Field2 { get; set;}
}

public class Class3
{
    public List<Class2> Class2List { get; set; }
}

我正在存储有关Class1列表的信息,并且所述列表的序列化按预期工作,即生成的文件包含我将其序列化的所有信息。

然而,当我反序列化时,虽然没有给出异常但是我可以读取信息,但是有一个问题,还有额外的信息被添加到Class3中。

Class3是一个在我的应用程序中用作其生命周期的Class3实例列表的类,我还使用它来查询应用程序流中与此问题无关的其他字段的信息。

问题是,当我在Class2List中读取包含1个或更多项的Class1列表时,我看到这些项被添加到Class3的Class3的Class2List属性中。

如果Class1列表中的多个元素引用相同的Class实例,则所有Class List成员都将添加到引用的Class3中。

我不知道为什么我发生了这种行为的错误,但是我发现将字段Class2List标记为JsonIgnore解决了这个问题,我看到没有将Class1.Class2List的实例添加到Class3.Class2List 。

任何人都可以向我解释为什么我所描述的行为确实发生了?我迷失了为什么会这样。

要提供示例,请使用上一版本的Newtonsoft.Json序列化以下代码的结果:

Class3 class3 = new Class3();
class3.Class2List2 = new List<Class2>();
class3.Class2List2.Add(new Class2() { Field1 = "Member1", Field2 = 1 });
class3.Class2List2.Add(new Class2() { Field1 = "Member2", Field2 = 2 });
class3.Class2List2.Add(new Class2() { Field1 = "Member3", Field2 = 3 });
class3.Class2List2.Add(new Class2() { Field1 = "Member4", Field2 = 4 });
class3.Class2List2.Add(new Class2() { Field1 = "Member5", Field2 = 5 });

Class1 class1 = new Class1();
class1.Class3Instance = class3;

给这个Json:

{
  "Class3Instance": {
    "Class2List2": [
      {
        "Field1": "Member1",
        "Field2": 1
      },
      {
        "Field1": "Member2",
        "Field2": 2
      },
      {
        "Field1": "Member3",
        "Field2": 3
      },
      {
        "Field1": "Member4",
        "Field2": 4
      },
      {
        "Field1": "Member5",
        "Field2": 5
      }
    ]
  },
  "Class2List": [
    {
      "Field1": "Member1",
      "Field2": 1
    },
    {
      "Field1": "Member2",
      "Field2": 2
    },
    {
      "Field1": "Member3",
      "Field2": 3
    },
    {
      "Field1": "Member4",
      "Field2": 4
    },
    {
      "Field1": "Member5",
      "Field2": 5
    }
  ]
}

然后,如果我立即反序列化JSON并再次序列化,我得到以下结果:

{
  "Class3Instance": {
    "Class2List2": [
      {
        "Field1": "Member1",
        "Field2": 1
      },
      {
        "Field1": "Member2",
        "Field2": 2
      },
      {
        "Field1": "Member3",
        "Field2": 3
      },
      {
        "Field1": "Member4",
        "Field2": 4
      },
      {
        "Field1": "Member5",
        "Field2": 5
      },
      {
        "Field1": "Member1",
        "Field2": 1
      },
      {
        "Field1": "Member2",
        "Field2": 2
      },
      {
        "Field1": "Member3",
        "Field2": 3
      },
      {
        "Field1": "Member4",
        "Field2": 4
      },
      {
        "Field1": "Member5",
        "Field2": 5
      }
    ]
  },
  "Class2List": [
    {
      "Field1": "Member1",
      "Field2": 1
    },
    {
      "Field1": "Member2",
      "Field2": 2
    },
    {
      "Field1": "Member3",
      "Field2": 3
    },
    {
      "Field1": "Member4",
      "Field2": 4
    },
    {
      "Field1": "Member5",
      "Field2": 5
    },
    {
      "Field1": "Member1",
      "Field2": 1
    },
    {
      "Field1": "Member2",
      "Field2": 2
    },
    {
      "Field1": "Member3",
      "Field2": 3
    },
    {
      "Field1": "Member4",
      "Field2": 4
    },
    {
      "Field1": "Member5",
      "Field2": 5
    }
  ]
}

如您所见,在我反序列化JSON时,Class2List成员已被复制。

c# json
1个回答
2
投票

正如@mortb所说:

问题在于Class3Instance.Class2List的快捷方式,所有已在JSON中序列化的List的成员将被添加到快捷方式的引用中,此外还有成员所说的引用先前在同一个JSON文件中。

这是因为反序列化不知道如何辨别Class1中的shorcut引用Class3Instance.Class2List和Class3中的Class2List,因此它不知道它是否应该忽略快捷方式字段上的序列化或反序列化操作。

为了解决这个问题,合同解析器或将属性[JsonIgnore]设置为快捷方式引用,解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.