c# - 在 Json.Net 中全局注册自定义 JsonConverter

标签 c# json.net

使用 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 实例。但是由于我不想或不能更改他们的代码,所以我没有办法介绍我的转换器。

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

最佳答案

是的,这可以使用 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());

关于c# - 在 Json.Net 中全局注册自定义 JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19510532/

相关文章:

c# - 反序列化 JSON 时需要忽略 NULL 值

c# - 使用 ReferenceLoopHandling.Ignore 序列化循环依赖的 ISerializable 对象时抛出 StackOverflowException

c# - 表单类,在简单的代码测试中不断得到 "System.StackOverflowException"

c# - 如何使用 Json.Net 和带有子类型的 Xamarin 反序列化 JSON?

C# 锁定私有(private)静态对象

c# - 无法返回对象

c# - JSON 字符串在 JSON.parse 中失败,但通过了 JsonConvert.DeserializeObject

c# - 在 C# 中将 JSON 数组转换为 XML

c# - 如何关闭 Visual Studio 的格式化选项?

c# - MVVM:我应该从我的执行方法中检查我的 "CanExecute"方法吗?