如何在使用JsonStringEnumConverter进行注释时防止外部枚举到字符串的转换



我使用的是Microsoft Graph包,其中包含许多用JsonStringEnumCovers注释的枚举。例如,考虑这样的枚举:

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum SomeEnum
{
First = 1,
Second = 2
}

在对象被序列化的类中,我使用此枚举作为属性类型。显然,这样的属性被序列化为字符串,当期望的结果是"{ "value": 1 }"时,我得到了类似于"{ "value": "First" }"的东西。

我该如何克服这种行为?

您可以编写自己的转换器:

public class SomeEnumConverter : JsonConverter<SomeEnum>
{
public override SomeEnum Read(ref Utf8JsonReader reader, Type type, 
JsonSerializerOptions options)
{
SomeEnum? result = null;
var value = reader.GetString();
if (int.TryParse(value, out int intval)) {
result = (SomeEnum)intval;
}
else {
if (Enum.IsDefined(type, value)) {
result = (SomeEnum)Enum.Parse(type, value);
}
}
return result.Value;
}
public override void Write(Utf8JsonWriter writer, SomeEnum value, 
JsonSerializerOptions options) 
=> writer.WriteStringValue(((int)value).ToString());
}

现在,您可以用装饰SomeEnum类型的Property类

[JsonConverter(typeof(SomeEnumConverter))]

在这种情况下,自定义转换器只处理用JsonConverter修饰的属性,否则将应用预定义的转换。

或者使用JsonSerializerOptions为SomeEnum类型指定JsonConverter。例如:

var options = new JsonSerializerOptions() {
WriteIndented = true
};
options.Converters.Add(new SomeEnumConverter());

在这种情况下,SomeEnum类型的所有属性都由自定义转换器处理。

测试使用:

var testClass = new SomeClass(SomeEnum.Third, true);
string json = JsonSerializer.Serialize(testClass, options);
var testClassNew = JsonSerializer.Deserialize<SomeClass>(json);

请注意,如果您传递一个未定义的值,例如:

var testClass = new SomeClass((SomeEnum)5, true);

Property值将被序列化并反序列化为整数表示(5(。

示例类(需要空构造函数(:

public class SomeClass
{
public SomeClass() { }
public SomeClass(SomeEnum enu, bool value) {
this.SomeValue = enu;
this.Other = value;
}
// Uncomment if JsonSerializerOptions are not used or
// you want to apply the converter to some but not all properties
// [JsonConverter(typeof(SomeEnumConverter))]
public SomeEnum SomeValue { get; set; }
public bool Other { get; set; }
}

最新更新