52

使用Json.Net,我的对象中有一些属性需要特别注意才能序列化/反序列化它们。作为 的后代JsonConverter,我成功地做到了这一点。这是执行此操作的常用方法:

public class SomeConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ...
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        ...
    }

    public override bool CanConvert(Type objectType)
    {
        ...
    }
}

class SomeClass
{
    [JsonProperty, JsonConverter(typeof(SomeConverter))]
    public SomeType SomeProperty;
}

//Later on, in code somewhere
SomeClass SomeObject = new SomeClass();
string json = JsonConvert.SerializeObject(SomeObject, new SomeConverter());

我对这段代码的问题是我需要在每个序列化/反序列化中引入我的自定义转换器。在我的项目中,有很多情况我无法做到这一点。例如,我正在使用其他使用 Json.Net 的外部项目,它们将在我的SomeClass实例上工作。但是由于我不想或不能更改他们的代码,所以我没有办法介绍我的转换器。

有什么方法可以注册我的转换器,static也许使用一些成员,在 Json.Net 中,所以无论序列化/反序列化发生在哪里,我的转换器总是存在的?

4

3 回答 3

80

是的,这可以使用 Json.Net 5.0.5 或更高版本。见JsonConvert.DefaultSettings

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new SomeConverter() }
};

// Later on...
string json = JsonConvert.SerializeObject(someObject);  // this will use SomeConverter

如果您使用的是 Web API,则可以像这样全局设置转换器:

var config = GlobalConfiguration.Configuration;
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.Converters.Add(new SomeConverter());
于 2013-10-22T08:11:25.523 回答
17

另一种方法(优先于上面提到的@Brian)是实现自定义合同解析器

JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver();

并且实现相当简单

public class CustomContractResolver : DefaultContractResolver
{
    private static readonly JsonConverter _converter = new MyCustomConverter();
    private static Type _type = typeof (MyCustomType);

    protected override JsonConverter ResolveContractConverter(Type objectType)
    {
        if (objectType == null || !_type.IsAssignableFrom(objectType)) // alternatively _type == objectType
        {
            return base.ResolveContractConverter(objectType);
        }

        return _converter;
    }
}

这两种方法都有效,这只是一个更大的锤子

于 2014-02-25T18:44:45.553 回答
0

这种来自问题ASP.NET Web API Custom JsonConverter is never called 的方法适用于 Web API:

// 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 MyConverter());
}

把它放在某个地方Global.asax

其他答案对我不起作用。DefaultSettings对 Web API 操作没有影响,并且JsonFormatter我使用的 .NET 框架版本中似乎不存在配置属性。

于 2019-07-25T14:30:04.657 回答