簡體   English   中英

讀取JSON文件會將項目添加到同一類的另一個屬性的列表中

[英]Reading a JSON file adds items to a list of another property of the same class

我有一組類似以下的類:

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列表時,看到這些項目正在添加到與Class1相關的Class3的Class2List屬性中。

如果Class1列表中的多個元素引用同一Class3實例,則所有Class2List成員都將添加到引用的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;

給這個傑森:

{
  "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成員已被復制。

正如@mortb所說:

問題在於Class3Instance.Class2List的快捷方式,除了先前提到的引用在同一JSON文件中擁有的成員之外,所有已在JSON中序列化的List成員都將添加到該快捷方式的引用中。

發生這種情況是因為反序列化不知道如何區分Class1中的快捷引用Class3Instance.Class2List和Class3中的Class2List,因此它不知道是否應該忽略快捷方式字段上的序列化或反序列化操作。

為了解決此問題,合同解析器或將屬性[JsonIgnore]設置為快捷方式引用都可以解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM