Можно ли установить первичную ссылку? - PullRequest
0 голосов
/ 07 мая 2020

У меня проблема ... У меня есть класс, который содержит список клиентов и список заказов, и каждый заказ содержит клиента как ссылку. Если я сериализую объект таким образом, я получу:

{
  "Customers": [
    {
      "$id": "1",
      "FirstName": "A",
      "LastName": "B"
    }
  ],
  "Orders": [
    {
      "Owner": {
        "$ref": "1"
      },
      "Desc": "Soup"
    }
  ]
}

Это нормально ... но если я удалю клиента, я получу:

{
  "Customers": [],
  "Orders": [
    {
      "Owner": {
        "$id": "1",
        "FirstName": "A",
        "LastName": "B"
      },
      "Desc": "Soup"
    }
  ]
}

Но что я sh должен иметь это:

{
  "Customers": [],
  "Orders": [
    {
      "Owner": null,
      "Desc": "Soup"
    }
  ]
}

Код, который я использовал:

[JsonObject(IsReference = true)]
public class Customer
{
    public String FirstName;
    public String LastName;
}

public class Order
{
    public Order(Customer T, String What)
    {
        Owner = T;
        Desc = What;
    }

    public Customer Owner;

    public String Desc;
}
public class Settings
{
    public List<Customer> Customers = new List<Customer>();

    public List<Order> Orders = new List<Order>();
}
public MainWindow()
{
    InitializeComponent();

    Settings Data = new Settings();

    Customer Customer = new Customer() { FirstName = "A", LastName = "B" };
    Data.Customers.Add(Customer);

    Order PlaceOrder = new Order(Data.Customers.First(), "Soup");
    Data.Orders.Add(PlaceOrder);

    Console.WriteLine(JsonConvert.SerializeObject(Data, Formatting.Indented));

    Data.Customers.Remove(Customer);

    Console.WriteLine(JsonConvert.SerializeObject(Data, Formatting.Indented));
    Close();
}

Может кто-нибудь помочь мне понять, как это сделать?

1 Ответ

0 голосов
/ 07 мая 2020

Прямо сейчас вы удаляете только Customer из списка:

Data.Customers.Remove(Customer);

Но Customer все еще существует и на него по-прежнему ссылается PlaceOrder. Если вы отлаживаете, установите точку останова после строки выше, вы увидите, что Data.Orders[0].Owner все еще содержит объект Customer.

Если вы не хотите, чтобы порядок в строке JSON указывал на клиент, то вы должны установить для этой ссылки значение null:

Data.Orders[0].Owner = null;
// or...
PlaceOrder.Owner = null;

Это должно привести к желаемому результату JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...