gpt4 book ai didi

c# - 使用 WebAPI 2 进行 JSON.NET 抽象/派生类反序列化

转载 作者:IT王子 更新时间:2023-10-29 04:43:23 24 4
gpt4 key购买 nike

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

当我尝试 PUT(反序列化)更新的 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;}
}

将我的 web api 配置为进行类型名称处理:

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" }] }

缺少继承的属性(property)。有人遇到过这个问题并想出什么办法吗?

最佳答案

$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"
}]
}

序列化程序能够将对象反序列化为正确的转换。一定会喜欢的!

关于c# - 使用 WebAPI 2 进行 JSON.NET 抽象/派生类反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20408771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com