WebApi自定义JsonConverter未调用

adr*_* h. 3 json asp.net-web-api

我为Guids实现了一个自定义的JsonConverter.

如果我在序列化类的属性(类型为Guid)上声明它,就像这样

[JsonConverter(typeof(JsonGuidConverter))]
Run Code Online (Sandbox Code Playgroud)

然后它被调用并且工作正常.

但是,我想"自动"使用它,而不需要属性,所以我这样做:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new JsonGuidConverter());
Run Code Online (Sandbox Code Playgroud)

不幸的是,这导致我的转换器永远不会被调用 我在MVC 5.1项目中使用WebApi 2.1.

有任何想法吗?

编辑:这是转换器代码

public class JsonGuidConverter : JsonConverter
{
    public override bool CanRead
    {
        get
        {
            // We only need the converter for writing Guids without dashes, for reading the default mechanism is fine
            return false;
        }
    }
    public override bool CanWrite
    {
        get
        {
            return true;
        }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Guid) || objectType == typeof(Guid?);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
    {
        // We declared above CanRead false so the default serialization will be used
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
    {
        if (value == null || Guid.Empty.Equals(value))
        {
            writer.WriteValue(string.Empty);
        }
        else
        {
            writer.WriteValue(((Guid)value).ToStringNoDashes());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外注意,甚至CanRead/CanWrite属性和CanConvert方法在尝试通过将其添加到转换器集合来调用时都会被调用.

也许它与我如何从webapi控制器返回数据有关?

public async Task<IHttpActionResult> GetSettings()
{
    ...
    return Json(something);
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*lla 5

由于您使用的是格式化程序,因此Json(something)在从操作返回时不要使用,而是Content(something)在这种情况下使用.该Content助手将信守格式化的设置.

我同意Json帮助者在这里感到困惑,我希望我们从未将这些东西包含在我们的产品中.