簡體   English   中英

當字符串以Json.Net中的數字開頭時,如何處理從字符串到枚舉的轉換

[英]How to handle conversion from string to enum when string starts with a number in Json.Net

我從服務器接收json,我使用Json.Net轉換為對象。 對於一個成員我正在使用StringEnumConverter ,它非常完美。

然而,服務器突然決定使用字符串,這些字符串也可能以一個導致JsonSerilizationException的數字開頭 - 顯然因為枚舉不能以.Net中的數字開頭。

現在我正在嘗試找到一個解決方案來處理它。我的第一個方法是在讀取Json時添加一個“_”(所以我的代碼中的枚舉將有一個起始_,當它們后跟一個數字時)和寫入時json我會刪除起始_(如果有一個數字跟隨)。 為此,我將StringEnumConverter復制到我的命名空間,並嘗試更改WriteJsonReadJson方法中的相應部分。 但是我不能使用StringEnumConverter因為我無法在自己的命名空間中訪問其他依賴項。

這個問題有沒有優雅的解決方案?

您可以創建一個JsonConverter並從前面修剪數字

public class Json_34159840
{
    public static string JsonStr = @"{""enum"":""1Value"",""name"":""James"",""enum2"":""1""}";

    public static void ParseJson()
    {
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            Converters = new List<JsonConverter> { new EnumConverter() }
        };

        // Later on...
        var result = JsonConvert.DeserializeObject<JsonClass>(JsonStr);
        Console.WriteLine(result.Enum);
        Console.WriteLine(result.Enum2);
        Console.WriteLine(result.Name);
    }
}

public class EnumConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var str = value.ToString();
        if (Regex.IsMatch(str, @"^_"))
        {
            writer.WriteValue(str.Substring(1));
        }
        else
        {
            writer.WriteValue(str);
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var value = reader.Value.ToString();
        if (Regex.IsMatch(value, @"^\d+$"))
        {
            return Enum.Parse(objectType, value);
        }

        if (Regex.IsMatch(value, @"^\d+"))
        {
            value = "_" + value;
        }

        return Enum.Parse(objectType, value);
    }

    public override bool CanConvert(Type objectType)
    {
        //You might want to do a more specific check like
        //return objectType == typeof(JsonEnum);
        return objectType.IsEnum;
    }
}

public enum JsonEnum
{
    _0Default,
    _1Value
}

public class JsonClass
{
    public string Name { get; set; }
    public JsonEnum Enum { get; set; }
    public JsonEnum Enum2 { get; set; }
}

希望這可以幫助。

編輯:添加了對整數的支持:D

一個簡單的策略是將值反序列化為string屬性,然后通過訪問器方法或輔助的getter-only屬性轉換為您自己的數據類型(枚舉或其他)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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