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

时间:2013-07-25 15:02:57

标签: .net rest webforms asp.net-web-api json.net

所以这是我的情况。我正在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.
    }
}

一旦我定义了I,然后将其插入到全局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(将来还会有更多的添加,我只是试图测试系统,“联系人”继承自“实体”):

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. Controller.Get被调用。返回联系人列表。
  2. 为枚举类型调用Converter.CanConvert。返回false。
  3. 为Contact类型调用Converter.CanConvert。返回true。
  4. 调用Converter.CanWrite。返回true。
  5. 调用Converter.WriteJson。将正确的JSON写入流
  6. 网站会收到正确的JSON,并且可以将其用作对象。
  7. 网站呼叫“更新”:

    1. 为Contact类型调用Converter.CanConvert。返回true。
    2. 调用Controller.Update。 “contact”参数为“null”。
    3. 我完全感到困惑。我不明白为什么这在序列化时有效,但整个过程似乎只是在尝试反序列化时跳过我的自定义转换器。任何人都有任何想法,我做错了什么?

      谢谢!

1 个答案:

答案 0 :(得分:7)

啊,阿吉兹。现在我感到愚蠢。

...我没有在帖子数据中发送JSON。我不小心发了一堆混乱的文字。糟糕...

没关系!