【问题标题】:WebApi custom JsonConverter not called未调用 WebApi 自定义 JsonConverter
【发布时间】:2014-08-28 11:56:09
【问题描述】:

我为 Guid 实现了一个自定义的 JsonConverter。

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

[JsonConverter(typeof(JsonGuidConverter))]

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

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

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new JsonGuidConverter());

不幸的是,这导致我的转换器永远不会被调用。我在 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());
        }
    }
}

附加说明,当尝试通过将 CanRead/CanWrite 属性和 CanConvert 方法添加到转换器集合中来使用它时,甚至不会调用它。

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

public async Task<IHttpActionResult> GetSettings()
{
    ...
    return Json(something);
}

【问题讨论】:

  • 你能分享你对JsonGuidConverter的实现吗?
  • 我编辑了问题以包含代码。
  • 感谢您的代码。你可以看看我的回复。

标签: json asp.net-web-api


【解决方案1】:

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

我同意 Json helper 在这里令人困惑,我希望我们从未将其包含在我们的产品中。

【讨论】:

  • 谢谢,就是这样!最后我使用了 Ok(),它也可以。
猜你喜欢
  • 2020-10-05
  • 2022-12-14
  • 2013-07-25
  • 2022-12-14
  • 1970-01-01
  • 2019-06-03
  • 2019-08-02
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多