从未调用ASP.NET Web API自定义JsonConverter



这是我的情况。我正在WebForms应用程序中实现一个WEB API。我有一堆动态类,它们本质上是字典,需要使用自定义JSON序列化格式化程序才能正常工作(因为默认转换器只显示了一堆键值配对)。

因此,首先我创建了一个自定义的JSON转换器:

/// <summary>
/// A class to convert entities to JSON
/// </summary>
public class EntityJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType.IsSubclassOf(typeof(Entity));
    }
    public override bool CanRead
    {
        get { return true; }
    }
    public override bool CanWrite
    {
        get { return true; }
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // Details not important. This code is called and works perfectly.
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Details not important. This code is *never* called for some reason.
    }
}

定义好后,我将其插入全局JSON媒体类型格式化程序:

        // Add a custom converter for Entities.
        foreach (var formatter in GlobalConfiguration.Configuration.Formatters)
        {
            var jsonFormatter = formatter as JsonMediaTypeFormatter;
            if (jsonFormatter == null)
                continue;
            jsonFormatter.SerializerSettings.Converters.Add(new EntityJsonConverter());
        }

最后,我的测试API(将来还会添加更多,我现在只是尝试测试系统,"Contact"继承自"Entity"):

public class ContactController : ApiController
{
    public IEnumerable<Contact> Get()
    {
        // Details not important. Works perfectly.
    }
    [HttpPost]
    public bool Update(Contact contact)
    {
        // Details not important. Contact is always "null".
    }
}

以下是我调试时看到的内容:

网站调用"get":

  1. 控制器。调用Get。返回联系人列表
  2. Converter.CanConvert是为枚举类型调用的。返回false
  3. Converter.CanConvert是为Contact类型调用的。返回true
  4. 调用Converter.CanWrite。返回true
  5. 调用Converter.WriteJson。将正确的JSON写入流
  6. 网站接收正确的JSON,并能够将其用作对象

网站调用"更新":

  1. Converter.CanConvert是为Contact类型调用的。返回true
  2. Controller.Update被调用。"contact"参数为"null"

我完全不知所措。我不明白为什么在序列化时这样做,但在尝试反序列化时,整个过程似乎只是跳过了我的自定义转换器。有人知道我做错了什么吗?

谢谢!

天啊。现在我觉得自己很笨。

我没有在帖子数据中发送JSON。我不小心发了一堆乱七八糟的短信。哇。。。

永远不会!

相关内容

  • 没有找到相关文章

最新更新