在Web API方法中使用动态参数

时间:2017-03-05 11:03:40

标签: c# json asp.net-web-api dynamic json.net

我正在处理Web API项目并使用Massive执行数据库任务。 在我的控制器中,我希望Post方法接受动态对象,因此可以直接使用Massive Insert方法。

public class LinkController : ApiController
{
    public IHttpActionResult Post(dynamic link)
    {
        dynamic model = new Massive.DynamicModel("main", tableName: "Links", primaryKeyField: "Id");
        return Ok(model.Insert(link));
    }
}

在POST请求中发送以下JSON:

{
    "Name":"StackOverflow",
    "Url":"http://www.stackoverflow.com",
    "Description":"My most visited web site!",
    "FolderId":2
}

我的问题是JSON.Net反序列化JSON的方式。调用Post方法时,链接参数具有预期的4个属性 但它们的类型为Newtonsoft.Json.Linq.JValue不是一些原始类型(对于Name的expample字符串)而Massive不能 处理JValue对象。

我需要强制参数为其属性提供原始类型(通过创建自定义JsonConverter,调整Web API模型绑定,...)。

1 个答案:

答案 0 :(得分:0)

您可以做的最好的事情是将您的DTO反序列化为ExpandoObject

// config.GetType() == typeof(HttpConfiguration)
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new ExpandoObjectConverter());

当您访问其属性时,它仍然是一个动态对象,因为它们是在具有.NET CLR类型的常规类中设计的。