I consume an API which returns the string values like this:
some-enum-value
I try to put these values in an enum
, since the default StringEnumConverter
doesn't do what I want, which is to to decorate this Converter with some additional logic.
How can I be sure that the values are deserialized correctly ?
The following code is my tryout to get this job done.
However the line
reader = new JsonTextReader(new StringReader(cleaned));
breaks the whole thing since the base.ReadJson
can't recognize the string as a JSON.
Is there a better way to do this without having to implement all the existing logic in a StringEnumConverter
?
How could I fix my approach?
public class BkStringEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
var enumString = reader.Value.ToString();
if (enumString.Contains("-"))
{
var cleaned = enumString.Split('-').Select(FirstToUpper).Aggregate((a, b) => a + b);
reader = new JsonTextReader(new StringReader(cleaned));
}
}
return base.ReadJson(reader, objectType, existingValue, serializer);
}
private static string FirstToUpper(string input)
{
var firstLetter = input.ToCharArray().First().ToString().ToUpper();
return string.IsNullOrEmpty(input)
? input
: firstLetter + string.Join("", input.ToCharArray().Skip(1));
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…