有选择地使用默认的 JSON 转换器 [英] Selectively use default JSON converter

查看:25
本文介绍了有选择地使用默认的 JSON 转换器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的 Web API 项目的 Startup.cs 中使用以下内容将枚举通过 JSON 序列化为字符串:

I use the following in my Web API project's Startup.cs to JSON-serialize Enums into strings:

// Configure JSON Serialization
var jsonSerializationSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
jsonSerializationSettings.Formatting = Newtonsoft.Json.Formatting.None;
jsonSerializationSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());

这是为了避免用 [JsonConverter(typeof(StringEnumConverter))]

现在,如何有选择地退出某些 Enum 属性的全局序列化设置并使用转换为整数的默认序列化程序?

Now, how can I selectively opt out of my global serialization setting for some Enum properties and use the default serializer that converts to integers?

推荐答案

您可以向有问题的属性添加一个不执行任何操作的虚拟转换器:

You could add a dummy converter to the properties in question that does nothing:

public class NoConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // Note - not called when attached directly via [JsonConverter(typeof(NoConverter))]
        throw new NotImplementedException();
    }

    public override bool CanRead { get { return false; } }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanWrite { get { return false; } }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

然后使用 [JsonConverter(typeof(NoConverter)))].这样做后,JsonConverter 属性的转换器取代了全局指定的转换器,但由于 CanReadCanWrite 都返回 false,因此不会执行转换.对于枚举集合,您可以使用 [JsonProperty(ItemConverterType = typeof(NoConverter)))].

Then attach it to the property using [JsonConverter(typeof(NoConverter))]. Having done so, the JsonConverter attribute's converter supersedes the globally specified converter, but since CanRead and CanWrite both return false no conversion is performed. For collections of enums, you could use [JsonProperty(ItemConverterType = typeof(NoConverter))].

例如,如果您定义类型:

For instance, if you define the types:

public enum Foo { A, B, C }

public class RootObject
{
    [JsonConverter(typeof(NoConverter))]
    public Foo FooAsInteger { get; set; }

    public Foo FooAsString { get; set; }
}

然后

var root = new RootObject { FooAsInteger = Foo.B, FooAsString = Foo.B };

var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter());

Console.WriteLine(json);

产生输出

{
  "FooAsInteger": 1,
  "FooAsString": "B"
}

请注意,如果您希望将所有数据模型中所有出现的枚举序列化为整数,也可以将 NoConverter 直接应用于枚举:

Note that you can also apply NoConverter directly to the enum, if you want all occurrences of the enum in all data models to be serialized as an integer:

[JsonConverter(typeof(NoConverter))]
public enum FooAlwaysAsInteger { A, B, C }

示例小提琴.

这篇关于有选择地使用默认的 JSON 转换器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆