[英]How to deserialize json property for enumeration class using Json.Net?
我試圖避免使用枚舉並使用枚舉類,例如此處解釋的https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/enumeration-classes-over-枚舉類型
現在我有以下示例
public class Dto
{
public string Name {get;set;}
public StatusType Status {get;set;}
}
public class StatusType : Enumeration
{
public static readonly StatusType Active = new StatusType (1, "Active");
public static readonly StatusType Inactive = new StatusType (2, "Inactive");
}
當我嘗試反序列化 Dto 時,例如
var message = JsonConvert.DeserializeObject<Dto>(test);
我收到錯誤“將值“Active”轉換為“StatusType”時出錯。
是否可以使用或創建一個轉換器,將值“Active”實際轉換為正確的 StatusType?
您將需要編寫自定義JsonConverter
。 例如像這樣:
public class StatusTypeConverter : JsonConverter<StatusType>
{
// can be build with reflection
private static Dictionary<string, StatusType> _map = new Dictionary<string, StatusType>(StringComparer.InvariantCultureIgnoreCase)
{
{StatusType.Active.Name, StatusType.Active},
{StatusType.Inactive.Name, StatusType.Inactive}
};
public override void WriteJson(JsonWriter writer, StatusType value, JsonSerializer serializer)
{
writer.WriteValue(value.Name);
}
public override StatusType ReadJson(JsonReader reader, Type objectType, StatusType existingValue, bool hasExistingValue, JsonSerializer serializer)
{
string s = (string)reader.Value;
return _map[s];
}
}
public class Dto
{
public string Name { get; set; }
[JsonConverter(typeof(StatusTypeConverter))]
public StatusType Status { get; set; }
}
var js = "{'name': 'Name', 'status': 'active'}";
Console.WriteLine(JsonConvert.DeserializeObject<Dto>(js).Status.Name); // prints "Active"
這段代碼顯然可以改進(缺少鍵的有意義的例外,構建可以在反射的幫助下處理所有Enumeration
子類型的轉換器)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.