有选择地使用默认 JSON 转换器

Selectively use default JSON converter(有选择地使用默认 JSON 转换器)
本文介绍了有选择地使用默认 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 }

示例 fiddle.

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

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)