【问题标题】:WebAPI 2 not deserializing List<string> property of FromBody object in POST requestWebAPI 2 未在 POST 请求中反序列化 FromBody 对象的 List<string> 属性
【发布时间】:2018-02-28 20:16:57
【问题描述】:

在我的一个 WebAPI 2 应用程序中,我在反序列化 FromBody 对象的 List&lt;string&gt; 属性时遇到了问题。 (列表保持为空,而其他属性已正确反序列化。)

无论我做什么,如果我将属性更改为string[],该属性似乎只会正确反序列化。对我来说不幸的是,该属性必须是 List&lt;string&gt; 类型。

根据another question I found,我应该能够反序列化为List&lt;T&gt;,只要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&lt;string&gt; Comments { get; set; }
  • @vc74 这个问题确实与创建新实例有关。那段代码的原因是我不希望能够获得Commentsnull 版本。
  • 那么你可以:List&lt;string&gt; Comments { get; set; } = new List&lt;string&gt;()
  • Comments 如果稍后在代码中设置为null,仍将返回null
  • 当您通过公共属性公开任何类型的集合时,请永远不要让其从外部设置为 1) null 2) 设置为 null。将 setter 设为私有,您将永远不必担心集合为空。空集合是邪恶的,应该用火杀死。在构造函数中初始化它们,或者在你声明它们的地方初始化它们。

标签: c# asp.net-web-api2 json-deserialization asp.net-apicontroller


【解决方案1】:

你试过了吗?

public class Project
{
    public List<string> Comments {get; set;}
    public Project () 
    { 
        Comments = new List<string>();
    }
    ...
}

【讨论】:

  • Commentsnull 时不创建新的List&lt;string&gt; 确实解决了这个问题。这段代码的问题在于,通过这种方式,Comments 如果已被重置,仍然可以返回null,我希望避免这种情况。
  • @DylanVB 当您通过公共属性公开任何类型的集合时,请永远不要让它成为 1) null 2) 从外部设置为 null。将 setter 设为私有,您将永远不必担心集合为空。空集合是邪恶的,请随时杀死它们。在构造函数中初始化它们,或者在你声明它们的地方初始化它们。
【解决方案2】:

感谢@vc74 和@s.m。 ,我设法将我的项目对象类更新为如下所示,以使其按我希望的方式工作:

public class Project
{
    public string ID { get; set; }
    public string Title { get; set; }
    public string Details { get; set; }

    private List<string> _comments = new List<string>();
    public List<string> Comments 
    { 
        get
        {
            return _comments;
        }
        set
        {
            if (value != _comments)
            {
                if (value == null)
                    _comments = new List<string>();
                else
                    _comments = value;
            }
        } 
    }

    public Project () { }

    // Other methods
}

不是试图防止获得来自Commentsnull值,我不得不防止将值设置为@987654324 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多