【问题标题】:Object not deserialising correctly on put request with web api对象在使用 web api 的放置请求时未正确反序列化
【发布时间】:2015-11-04 12:10:01
【问题描述】:

我正在使用 web-api 2 和 postman rest 客户端进行测试。

我有一个如下所示的方法定义:

[Route("api/bob/user")]
[HttpPut]
public IHttpActionResult UpdateUser(User user)

用户对象如下所示:

public class User : IUser
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

public interface IUser
{
    string Firstname { get; set; }
    string Lastname { get; set; }
}

在邮递员中,我设置了一个 put 请求并将内容类型设置为 JSON(application/json) 我在正文中将以下内容指定为原始:

{
   "user": {"Firstname":"Bob","Lastname":"Smith"}
}

当我发送请求时,检测到对象类型但没有填充任何属性(它们都是空的),这让我相信反序列化失败了。

如果我将方法签名更改为对象,我将获得 json 字符串并将其反序列化为用户对象。如果可能的话,我更喜欢强类型。

我的 webapiconfig 如下所示:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(
                                    new MediaTypeHeaderValue("text/html"));

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new {id = RouteParameter.Optional});

我还添加了测试客户端的截图:

【问题讨论】:

  • 您是否在请求中使用Content-Type: application/json
  • 还可以尝试在“用户用户”之前添加“[FromBody]”属性
  • 是的,我是邮递员,有这套我已经添加了一个屏幕截图来展示这个。
  • 没有 FromBody 没有区别

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


【解决方案1】:

您不应该将user 属性放在前面。您的 JSON 应如下所示:

{
   "Firstname": "Bob",
   "Lastname": "Smith"
}

为了让模型绑定器绑定到模型。

如果您希望使用当前的 JSON,您的 User 模型应如下所示

public class User {
   public User User { get; set; }  
}

还要确保使用 application/json 作为内容类型。

【讨论】:

  • facepalm,你是对的,我会尽快接受这个。对于那些不明白答案的人,json中的对象不是用户类型,因此序列化失败..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2021-06-08
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多