我使用的是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; }
}