簡體   English   中英

如何使用 Json.Net 反序列化 json 屬性以枚舉 class?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM