当字符串在Json.Net中以数字开头时,如何处理从字符串到枚举的转换
本文关键字:字符串 处理 转换 枚举 何处理 Net Json 数字 开头 | 更新日期: 2023-09-27 18:26:12
我从服务器接收json,我正在使用json.Net将其转换为对象。对于一个成员,我使用的是非常完美的StringEnumConverter
。
然而,突然之间,服务器决定使用也可以以数字开头的字符串,这会导致JsonSerializationException——显然是因为枚举不能以.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属性转换为您自己的数据类型(枚举或其他)。