簡體   English   中英

使來自C#空類實例的序列化JSON返回空數組

[英]Make serialized JSON from C# null class instance return empty array

給定以下簡單的類:

public class Person
{
  public int id { get; set; }
  public List<Order> orders { get; set; }
}

orders屬性為null,並且使用以下JSON.NETPerson實例進行序列化后:

var json = JsonConvert.SerializeObject(myPerson);

orders = null時,我需要返回的物理輸出(這是一個現有約束),如下所示:

{
 "id": 1,
 "orders": []
}

但是,正在發生的情況是orders屬性返回的所有空值如下所示:

{
 "id": 1,
 "orders": [
    {
      "id": null,
      "total":null,
      "orderDate":null,
      "itemQuantity":null
    }
  ]
}

如果為null ,則無法返回該集合,而是需要將其顯示為基本上為空的數組,例如: "orders": []"

我試過了:

myPerson.orders = null;

但是,這仍然會產生完整的對象集合,並顯示所有空值。

我該如何干預此對象的序列化或操作,以使它以物理形式返回為空數組,而不是擴展的null字段集合?

編輯:部分問題通過評論得到了回答。 返回的完整對象實例是由於LINQ查詢返回了實例化默認orders實例的結果集。 但是,問題的主要部分仍然是使它返回"orders":[]不是 "orders":null

"orders": [
  {
    "id": null,
    "total":null,
    "orderDate":null,
    "itemQuantity":null
  }
]

您在上面看到的輸出不能由人員的空orders屬性引起。 JSON數組確實有一個項目,因此訂單列表中也需要有一個項目。 它恰好具有其所有屬性的默認值,這就是為什么每個鍵都為null原因。

因此,如果您確定在哪里創建了空的Order對象並將其添加到列表中,則可以擺脫該輸出。

至於序列化一個空列表,你有兩個選擇:你可以把它序列化的null通過設置屬性為null直接( person.orders = null )。 或者,您可以通過為屬性分配一個空列表( person.orders = new List<Order>() )將其序列化為一個空數組[]

您也可以操縱序列化程序以始終創建一個空數組,即使該屬性為null 有關示例,請參見此答案

您可以在類構造函數中初始化集合,然后將獲得所需的輸出:

public class Person
{
    public Person()
    {
        orders = new List<Order>();
    }

    public int id { get; set; }
    public List<Order> orders { get; set; }
}

另外,您可以為您的財產個性化吸氣劑,但我個人不建議這樣做,因為在出​​現錯誤的情況下很難找到它。

public class Person
{       
    public int id { get; set; }

    private List<Order> _orders;

    public List<Order> orders
    {
        get
        {
            if (_orders == null)
            {
                _orders = new List<Order>();
            }

            return _orders;
        }
        set { _orders = value; }
    }
}

暫無
暫無

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

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