为什么我的Web API控制器操作不反序列化子属性的子属性?

son*_*lis 5 json asp.net-web-api frombodyattribute

我正在将PUT请求中的json有效负载发送到Web API控制器操作.有问题的行为有一个如下所示的签名:

public IHttpActionResult Post([FromBody]SaveThingRequest request)
Run Code Online (Sandbox Code Playgroud)

SaveThingRequest看起来像这样:

public class SaveThingRequest
{
    public List<ElementInfo> Elements { get; set; }

    public class ElementInfo
    {
        public List<ElementSettingInfo> Settings { get; set; }

        public class ElementSettingInfo
        {
            public string Name { get; set; }
            public string Value { get; set; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在包含具有设置的元素的请求正文中发布了json.我通过在控制器操作中手动反序列化并确认JSON具有类似于以下内容的结构来证实这一点:

{
    Elements: [
        {
            Settings: [
                {
                    Name: 'Name 1',
                    Value: 'Value 1'
                },
                {
                    Name: 'Name 2',
                    Value: 'Value 2'
                }
            ]
        },
        {
            Settings: [
                {
                    Name: 'Name 1',
                    Value: 'Value 1'
                },
                {
                    Name: 'Name 2',
                    Value: 'Value 2'
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是,当.NET反序列化有效负载并创建SaveThingRequest时,我的元素将被填充,但所有元素都具有空的Settings属性.我不知道怎么解决这个问题.有没有人对这里可能发生的事情有任何想法?

son*_*lis 16

这个问题应该删除.它像宣传的那样工作.我的问题是我在JSON上有一个名为'settings'(小写)的附加属性,反序列化器试图匹配,因为如果找不到区分大小写的情况,NewtonSoft反序列化会尝试非区分大小写的匹配.通过将方法的签名更改为:我能够发现正在发生的事情:

public IHttpActionResult Post([FromBody]object request)
Run Code Online (Sandbox Code Playgroud)

然后将其添加到方法实现中:

var result = JsonConvert.DeserializeObject<SaveThingRequest>(request.ToString());
Run Code Online (Sandbox Code Playgroud)

我有一个反序列化异常说:

无法将当前JSON对象(例如{"name":"value"})反序列化为类型'System.Collections.Generic.List`1 [Noteable.Contracts.ClinicalReports.SaveThingRequest + ElementInfo + ElementSettingInfo]',因为该类型需要JSON数组(例如[1,2,3])正确反序列化.要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List.JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化.路径'Elements [0] .settings.TextSize',第11行,第20位.

消息的结尾向我展示了当解串器失败并将我指向正确方向时被反序列化的内容.= [

  • 这是一个非常好的解决方案,可帮助您使用Web apis调试反序列化问题. (4认同)
  • 真正的堆栈溢出是当您回答自己的问题并为每个人提供有价值的调试方法时. (4认同)
  • 这是找到问题的真正根源的非常有用的方法。任何想法如何在发生时捕获真正的基础JSON异常? (2认同)
  • 这极大地帮助了我。感谢您使用此故障排除方法。 (2认同)

小智 5

我陷入了同样的问题。然而,问题是别的。

就我而言,未获得序列化的属性是在没有公共访问说明符的情况下声明的。我向公众宣布了它,它运行得非常好。

希望这会帮助陷入这种情况的人。我花了 20 分钟才找到这个解决方案。