如何使用WebAPI 2的JSON.NET抽象/派生类反序列化?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

我正在实现一个使用JSON.NET进行序列化的Web API 2服务。

当我尝试去更新json数据时,抽象类不存在,这意味着它不知道如何处理它,所以它什么也没做。我也试着让这个类不是抽象的,只是从它继承而来,然后每个PUT分散到基类中,而不是缺少衍生类的属性的耙类。

例:

public class People
{
      // other attributes removed for demonstration simplicity

      public List<Person> People { get;set; }
}

public abstract class Person
{
      public string Id {get;set;}
      public string Name {get;set;}
}

public class Employee : Person 
{
      public string Badge {get;set;}
}

public class Customer : Person
{
     public string VendorCategory {get;set;}
}

将我的WebAPI配置为执行TypeName处理:

public static void Register(HttpConfiguration config)
{
     config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = 
            TypeNameHandling.Objects;
}

然后,我将JSON放在下面这样的位置:

{
     people: [{
          name: "Larry",
          id: "123",
          badge: "12345",
          $type: "API.Models.Employee, API"
     }]
}

到Web API方法:

public HttpResponseMessage Put(string id, [FromBody]People value)
{
      people.Update(value); // MongoDB Repository method ( not important here )
      return Request.CreateResponse(HttpStatusCode.OK);
}

但检查时的输出value总是:

People == { People: [] }

或者非抽象的:

People == { People: [{ Name: "Larry", Id: "123" }] }

缺少继承的属性。有人遇到这个问题想出什么了吗?

提问于
用户回答回答于

$type函数必须在对象中的第一属性。

在上面的例子中,我做了:

 {
   people: [{
      name: "Larry",
      id: "123",
      badge: "12345",
      $type: "API.Models.Employee, API"
   }]
 }

在移动$type到顶部后,如:

 {
   people: [{
      $type: "API.Models.Employee, API",
      name: "Larry",
      id: "123",
      badge: "12345"
   }]
 }

序列化程序能够将对象去关联到正确的属性。

用户回答回答于

我已经尝试过你的场景,它工作正常。但我确实注意到你在json输入中,id属性之后缺少一个(逗号)。

我通过在我的动作中使用以下ModelState有效性检查,然后在请求有效载荷中显示错误,我想到了这一点。这对你也很有用:

if (!ModelState.IsValid)
{
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, this.ModelState);
}

扫码关注云+社区