【发布时间】:2018-02-28 20:16:57
【问题描述】:
在我的一个 WebAPI 2 应用程序中,我在反序列化 FromBody 对象的 List<string> 属性时遇到了问题。 (列表保持为空,而其他属性已正确反序列化。)
无论我做什么,如果我将属性更改为string[],该属性似乎只会正确反序列化。对我来说不幸的是,该属性必须是 List<string> 类型。
根据another question I found,我应该能够反序列化为List<T>,只要T 不是Interface。
有没有人知道我做错了什么?
控制器:
public class ProjectsController : ApiController
{
public IHttpActionResult Post([FromBody]Project project)
{
// Do stuff...
}
}
项目对象类:
public class Project
{
public string ID { get; set; }
public string Title { get; set; }
public string Details { get; set; }
private List<string> _comments;
public List<string> Comments
{
get
{
return _comments ?? new List<string>();
}
set
{
if (value != _comments)
_comments = value;
}
}
public Project () { }
// Other methods
}
请求 JSON:
{
"Title": "Test",
"Details": "Test",
"Comments":
[
"Comment1",
"Comment2"
]
}
【问题讨论】:
-
为什么需要重新创建列表实例?
Comments应该只是public List<string> Comments { get; set; } -
@vc74 这个问题确实与创建新实例有关。那段代码的原因是我不希望能够获得
Comments的null版本。 -
那么你可以:
List<string> Comments { get; set; } = new List<string>() -
Comments如果稍后在代码中设置为null,仍将返回null。 -
当您通过公共属性公开任何类型的集合时,请永远不要让其从外部设置为 1)
null2) 设置为null。将 setter 设为私有,您将永远不必担心集合为空。空集合是邪恶的,应该用火杀死。在构造函数中初始化它们,或者在你声明它们的地方初始化它们。
标签: c# asp.net-web-api2 json-deserialization asp.net-apicontroller