在 Web API 中你必须区分三个概念 -ModelBinding
, Formatters
and ParameterBinding
。这对于从 MVC 迁移到/习惯于 MVC 的人来说非常令人困惑,我们只讨论ModelBinding
.
ModelBinding
与 MVC 相反,它只负责从 URI 中提取数据。格式化程序负责读取正文,并且ParameterBinding
(HttpParameterBinding
) 包含前两个概念。
ParameterBinding
仅当您想要彻底改变整个机制时(即允许从正文绑定两个对象,实现 MVC 样式绑定等),真正有用 - 对于更简单的任务,修改绑定器(对于 URI 特定数据)或格式化程序(对于正文数据) )几乎总是绰绰有余。
无论如何,重点是 - 您想要实现的目标可以很容易地通过自定义来完成JSON.NET
转换器(JSON.NET 是 Web API JSON 格式化引擎背后的默认序列化库)。
您需要做的就是:
public class Param
{
public int Id { get; set; }
public string Name { get; set; }
[JsonConverter(typeof(CustomArrayConverter))]
public string Choices { get; set; }
}
然后添加转换器:
internal class CustomArrayConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
var array = JArray.Load(reader);
return JsonConvert.SerializeObject(array);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, JArray.Parse(value as string));
}
}
在本例中,我们告诉转换器中的 JSON.NET 来存储Choices
as string
(在 read 方法中),当您返回Param
对象与Choices
属性给客户端(在 write 方法中)我们采取string
并序列化为array
这样输出 JSON 看起来与输入完全相同。
您现在可以像这样测试它:
public Param PostParam(Param param)
{
return param;
}
并验证传入的数据是否如您所愿,并且输出的数据是否与原始 JSON 相同。