【问题标题】:Assign JsonConverter to class without using an attribute将 JsonConverter 分配给类而不使用属性
【发布时间】:2015-10-27 13:59:01
【问题描述】:

我想在不使用 [JsonConverter(typeof(...))] 属性的情况下将 JsonConverter 分配给一个类(因为我正在使用 Web API 做一些复杂的事情,这需要我在与定义类的位置不同的程序集中分配 JsonConverter)。

Globally use a JsonConverter on a class without the attribute 的答案几乎回答了我的问题。但是我的问题是关于 Web API,所以我不清楚:

  • 我的合同解析器应该使用什么基类?我怀疑它应该是JsonContractResolver,但不确定要传递给其构造函数的MediaTypeFormatter 对象。
  • 在 Web API 中声明自定义合同解析器的正确方法是什么?

下面的代码是我尝试过的,但它不起作用。我的自定义合约解析器没有被使用,CreateObjectContract() 中的断点没有被命中。

Global.asax.cs

protected void Application_Start()
{
    GlobalConfiguration.Configuration.Formatters.JsonFormatter
        .SerializerSettings.ContractResolver =
            new CustomResolver(GlobalConfiguration.Configuration.Formatters.JsonFormatter);
    ...
}

CustomResolver.cs

public class CustomResolver : JsonContractResolver
{
    public CustomResolver(MediaTypeFormatter formatter) : base(formatter) { }

    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);
        if (typeof(MyBaseClass).IsAssignableFrom(objectType))
            contract.Converter = new MyBaseClassJsonConverter();

        return contract;
    }
}

【问题讨论】:

标签: .net asp.net-web-api json.net asp.net-web-api2


【解决方案1】:

我在不使用自定义合约解析器的情况下解决了这个问题,只需将我的 JsonConverter 类添加到 WebApiConfig.cs 中的 JsonSerializerSettings.Converters 集合:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new MyBaseClassJsonConverter());

也可以在 Global.asax.cs 中注册:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new MyBaseClassJsonConverter());

(这个问题被标记为另一个类似问题的重复。但是我仍然发布一个答案,因为另一个问题只是关于一个特定的 JsonConverter 并且接受的答案并没有说明如何解决Web API 的问题。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2021-11-20
  • 2018-12-07
  • 2021-12-02
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多