从C#null类实例生成序列化JSON返回空数组

时间:2015-08-20 19:24:01

标签: c# json asp.net-web-api json.net

给出以下简单类:

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

orders属性为null时,以及Person实例使用下面的JSON.NET序列化后:

var json = JsonConvert.SerializeObject(myPerson);

我需要返回 physical 输出(它是现有约束),在orders = null时看起来如下所示:

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

然而,正在发生的事情是返回orders属性,其中包含所有空值,如下所示:

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

我无法在null时返回该集合,而是需要显示为基本上为空的数组,如:"orders": []"

我试过了:

myPerson.orders = null;

但是,这仍然会生成显示所有空值的完整对象集合。

如何干预这个对象的序列化或操作,以便我可以将它作为空数组返回,而不是扩展的空字段集合?

编辑:通过评论回答了部分问题。返回的完整对象实例是由于LINQ查询返回实例化默认实例OF orders的结果集。不过,问题的主要部分仍然是让它返回"orders":[] "orders":null

2 个答案:

答案 0 :(得分:1)

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

您在上面看到的输出不能由此人的空orders属性引起。 JSON数组确实有一个项目,因此订单列表中也需要有一个项目。它恰好具有所有属性的默认值,这就是每个键都有null的原因。

因此,如果您确定创建空Order对象的位置并将其添加到列表中,您可以摆脱该输出。

对于序列化空列表,您有两种选择:您可以通过将属性直接设置为nullnull)将其序列化为person.orders = null。或者,您可以通过为属性分配一个空列表([])将其序列化为空数组person.orders = new List<Order>()

即使属性为null,您也可以操纵序列化程序始终创建一个空数组。有关示例,请参阅this answer

答案 1 :(得分:0)

您可以在类构造函数中初始化集合,然后您将获得所需的输出:

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; }
    }
}