Example #1
0
        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);
            }
        }
Example #2
0
        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.");
        }