给出以下简单类:
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
答案 0 :(得分:1)
"orders": [
{
"id": null,
"total":null,
"orderDate":null,
"itemQuantity":null
}
]
您在上面看到的输出不能由此人的空orders
属性引起。 JSON数组确实有一个项目,因此订单列表中也需要有一个项目。它恰好具有所有属性的默认值,这就是每个键都有null
的原因。
因此,如果您确定创建空Order
对象的位置并将其添加到列表中,您可以摆脱该输出。
对于序列化空列表,您有两种选择:您可以通过将属性直接设置为null
(null
)将其序列化为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; }
}
}