【问题标题】:Selectively use default JSON converter有选择地使用默认 JSON 转换器
【发布时间】:2017-02-05 21:57:29
【问题描述】:

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

// 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 属性

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

【问题讨论】:

  • 理想情况下,您应该只装饰所需的properties 而不是全局设置
  • 您要退出特定属性还是特定枚举?
  • @dcb 对于特定属性,可能通过使用属性。

标签: c# asp.net asp.net-web-api json.net


【解决方案1】:

您可以将一个虚拟转换器添加到有问题的属性中,它什么都不做:

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 属性的转换器取代了全局指定的转换器,但由于CanRead 和CanWrite 都返回 false,因此不执行任何转换。对于枚举集合,您可以使用[JsonProperty(ItemConverterType = typeof(NoConverter))]。

例如,如果您定义类型:

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 直接应用于枚举:

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

示例fiddle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2019-10-10
    • 2012-10-10
    • 2017-09-10
    相关资源
    最近更新 更多