C# 如何在另一个自定义转换器内使用转换器序列化枚举
我有一个自定义的JSON转换器,因为第三方API只接受特定的结构C# 如何在另一个自定义转换器内使用转换器序列化枚举,c#,json.net,C#,Json.net,我有一个自定义的JSON转换器,因为第三方API只接受特定的结构 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var bodyRequest = (IRequest) value; writer.WriteStartObject(); writer.WritePropertyName(bodyRequest.RequestName);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var bodyRequest = (IRequest) value;
writer.WriteStartObject();
writer.WritePropertyName(bodyRequest.RequestName);
writer.WriteStartObject();
writer.WritePropertyName("-xmlns");
writer.WriteValue("http://example.com");
writer.WritePropertyName(bodyRequest.WrapperName);
writer.WriteStartObject();
var contractResolver = new CamelCasePropertyNamesContractResolver {
IgnoreSerializableAttribute = false
};
var properties = value.GetType().GetProperties();
foreach(var propertyInfo in properties) {
if (HasAttribute(propertyInfo, typeof(JsonIgnoreAttribute))) {
continue;
}
var propValue = propertyInfo.GetValue(value);
var propertyName = contractResolver.GetResolvedPropertyName(propertyInfo.Name);
writer.WritePropertyName(propertyName);
writer.WriteValue(propValue);
}
writer.WriteEndObject();
writer.WriteEndObject();
writer.WriteEndObject();
}
因此,我使用WriteXXX
方法创建structure,然后获取所有属性并序列化它们。一切正常,但我需要处理枚举。例如,我们有以下请求模型:
public class ExampleRequest : IRequest
{
public long Id{ get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public CarType CarType { get; set; }
public string RequestName => "Request";
public string WrapperName => "SendData";
}
public enum CarType
{
[EnumMember(Value = "NEW_CAR")
New,
[EnumMember(Value = "OLD_CAR")
Old
}
目前,序列化后,我看到
CarType
的数值为0或1,我知道我使用反射,而StringEnumConverter
被忽略。在这种情况下如何正确序列化?在循环中,检查属性是否应用了JsonConverterAttribute
。如果是这样,请获取转换器的类型,实例化它,然后调用其WriteJson
方法,而不是直接写入值。否则,只需像现在这样编写值
换言之,替换此行:
writer.WriteValue(propValue);
为此:
var att = propertyInfo.GetCustomAttribute<JsonConverterAttribute>();
if (att != null)
{
var converter = (JsonConverter)Activator.CreateInstance(att.ConverterType);
converter.WriteJson(writer, propValue, serializer);
}
else
{
writer.WriteValue(propValue);
}
var att=propertyInfo.GetCustomAttribute();
如果(att!=null)
{
var converter=(JsonConverter)Activator.CreateInstance(att.ConverterType);
WriteJson(writer、propValue、serializer);
}
其他的
{
writer.WriteValue(propValue);
}
将尝试。谢谢