[英]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
復制到我的命名空間,並嘗試更改WriteJson
和ReadJson
方法中的相應部分。 但是我不能使用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.