在我的WPF代码中,我使用Newtonsoft.Json将json反序列化为我的模型。首先,我接收一个Json字符串('json'),然后将其解析为'message'。(我想反序列化的对象被包装在json字符串中的"data"字段中)。
Activity message = JObject.Parse(json)["data"].ToObject<Activity>();
我的Activity类使用了几个[JsonProperty]属性来生成其字段。其中一个是枚举类型,称为“ActivityType”。
[JsonProperty("type")]
[JsonConverter(typeof(ActivityTypeConverter))]
public ActivityType Type { get; set; }
public enum ActivityType {
EmailOpen,
LinkClick,
Salesforce,
Unsupported
};
public class ActivityTypeConverter : JsonConverter {
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var rawString = existingValue.ToString().ToLower();
if (rawString.Contains("click"))
return ActivityType.LinkClick;
else if (rawString.Contains("salesforce"))
return ActivityType.Salesforce;
else if (rawString.Contains("email_open"))
return ActivityType.EmailOpen;
else
{
Console.WriteLine("unsupported " + rawString);
return ActivityType.Unsupported;
}
}
public override bool CanConvert(Type objectType)
{
return !objectType.Equals(typeof(ActivityType));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
令人奇怪和沮丧的是,我知道具有 "type":"email_open" 的 json 对象被反序列化为 ActivityType.Unsupported,即使我的转换器应该将它们反序列化为 EmailOpen。
调试显示问题所在:json 字段 "type" 自动将 "email_open" 反序列化为 EmailOpen,并通过我的转换器发送。(因为 EmailOpen.ToString() 没有下划线,所以当我的条件检查下划线时会出错。) 那么我的问题是:为什么会进行转换而不使用我的转换器,我该如何停止它?我只想让它使用我的转换器。
objectType.Equals(typeof(ActivityType)
(前面没有!
)吗?(或者直接写成objectType == typeof(ActivityType)
)? - dbc