【问题标题】:ASP.NET Web API Custom JsonConverter is never called从未调用 ASP.NET Web API 自定义 JsonConverter
【发布时间】:2013-07-25 13:31:18
【问题描述】:

这就是我的情况。我正在 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. Controller.Get 被调用。返回联系人列表。
  2. 为枚举类型调用Converter.CanConvert。返回 false。
  3. Converter.CanConvert 为 Contact 类型调用。返回真。
  4. Converter.CanWrite 被调用。返回真。
  5. Converter.WriteJson 被调用。将正确的 JSON 写入流
  6. 网站接收到正确的 JSON 并能够将其用作对象。

网站调用“更新”:

  1. Converter.CanConvert 为 Contact 类型调用。返回真。
  2. Controller.Update 被调用。 “contact”参数为“null”。

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    没关系!

    【讨论】:

    • 很高兴你明白了。您可能应该将您的答案标记为已接受,以便人们知道问题已解决。
    • 我打算。不过,Stack Overflow 直到明天才会让我这样做。
    猜你喜欢
    • 2020-10-05
    • 2017-09-08
    • 2014-08-28
    • 2022-12-14
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多