public T Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) { var token = reader.GetCurrentJsonToken(); switch (token) { case JsonToken.String: // avoid string decoding if possible. var key = reader.ReadStringSegmentUnsafe(); T value; if (!nameValueMapping.TryGetValue(key, out value)) { var str = StringEncoding.UTF8.GetString(key.Array, key.Offset, key.Count); value = (T)Enum.Parse(typeof(T), str); // Enum.Parse is slow } return(value); case JsonToken.Number: return(deserializeByUnderlyingValue(ref reader, formatterResolver)); default: ThrowHelper.ThrowInvalidOperationException_ParseJSON(); return(default); } }
public T Deserialize(JsonReader reader, IJsonFormatterResolver formatterResolver) { var token = reader.GetCurrentJsonToken(); if (token == JsonToken.String) { // avoid string decoding if possible. var key = reader.ReadStringSegmentUnsafe(); T value; if (!nameValueMapping.TryGetValue(key, out value)) { var str = StringEncoding.UTF8.GetString(key.Array, key.Offset, key.Count); value = (T)Enum.Parse(typeof(T), str); // Enum.Parse is slow } return(value); } else if (token == JsonToken.Number) { return(deserializeByUnderlyingValue(reader, formatterResolver)); } throw new InvalidOperationException("Can't parse JSON to Enum format."); }