decimal IJsonFormatterSpecReader <decimal, JsonReaderUtf8> .DeserializeSpec(JsonReaderUtf8 reader, IJsonFormatterResolver formatterResolver)
        {
            var token = reader.GetCurrentJsonToken();

            if (token == JsonToken.Number)
            {
                var number = reader.ReadNumberSegment();
                return(decimal.Parse(StringEncoding.UTF8.GetString(number.Array, number.Offset, number.Count), NumberStyles.Float, CultureInfo.InvariantCulture));
            }
            else if (token == JsonToken.String)
            {
                return(decimal.Parse(reader.ReadString(), NumberStyles.Float, CultureInfo.InvariantCulture));
            }
            else
            {
                throw new InvalidOperationException("Invalid Json Token for DecimalFormatter:" + token);
            }
        }
Exemplo n.º 2
0
 DateTime IJsonFormatterSpecReader <DateTime, JsonReaderUtf8> .DeserializeSpec(JsonReaderUtf8 reader, IJsonFormatterResolver formatterResolver)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 3
0
        public TimeSpan Deserialize(JsonReader reader, IJsonFormatterResolver formatterResolver)
        {
            var str   = reader.ReadStringSegmentUnsafe();
            var array = str.Array;
            var i     = str.Offset;
            var len   = str.Count;
            var to    = str.Offset + str.Count;

            // check day exists
            bool hasDay = false;
            {
                bool foundDot   = false;
                bool foundColon = false;
                for (int j = i; j < str.Count; j++)
                {
                    if (array[j] == '.')
                    {
                        if (foundColon)
                        {
                            break;
                        }
                        foundDot = true;
                    }
                    else if (array[j] == ':')
                    {
                        if (foundDot)
                        {
                            hasDay = true;
                        }
                        foundColon = true;
                    }
                }
            }

            // check sign
            var minus = false;

            if (array[i] == '-')
            {
                minus = true;
                i++;
            }

            var day = 0;

            if (hasDay)
            {
                var poolArray = BufferPool.Default.Rent();
                try {
                    for (; array[i] != '.'; i++)
                    {
                        poolArray[day++] = array[i];
                    }
                    day = new JsonReaderUtf8(poolArray).ReadInt32();
                    i++; // skip '.'
                } finally {
                    BufferPool.Default.Return(poolArray);
                }
            }

            var hour = (array[i++] - (byte)'0') * 10 + (array[i++] - (byte)'0');

            if (array[i++] != (byte)':')
            {
                goto ERROR;
            }
            var minute = (array[i++] - (byte)'0') * 10 + (array[i++] - (byte)'0');

            if (array[i++] != (byte)':')
            {
                goto ERROR;
            }
            var second = (array[i++] - (byte)'0') * 10 + (array[i++] - (byte)'0');

            int ticks = 0;

            if (i < to && array[i] == '.')
            {
                i++;

                // *7.
                if (!(i < to) || !NumberConverter.IsNumber(array[i]))
                {
                    goto END_TICKS;
                }
                ticks += (array[i] - (byte)'0') * 1000000;
                i++;

                if (!(i < to) || !NumberConverter.IsNumber(array[i]))
                {
                    goto END_TICKS;
                }
                ticks += (array[i] - (byte)'0') * 100000;
                i++;

                if (!(i < to) || !NumberConverter.IsNumber(array[i]))
                {
                    goto END_TICKS;
                }
                ticks += (array[i] - (byte)'0') * 10000;
                i++;

                if (!(i < to) || !NumberConverter.IsNumber(array[i]))
                {
                    goto END_TICKS;
                }
                ticks += (array[i] - (byte)'0') * 1000;
                i++;

                if (!(i < to) || !NumberConverter.IsNumber(array[i]))
                {
                    goto END_TICKS;
                }
                ticks += (array[i] - (byte)'0') * 100;
                i++;

                if (!(i < to) || !NumberConverter.IsNumber(array[i]))
                {
                    goto END_TICKS;
                }
                ticks += (array[i] - (byte)'0') * 10;
                i++;

                if (!(i < to) || !NumberConverter.IsNumber(array[i]))
                {
                    goto END_TICKS;
                }
                ticks += (array[i] - (byte)'0') * 1;
                i++;

                // others, lack of precision
                while (i < to && NumberConverter.IsNumber(array[i]))
                {
                    i++;
                }
            }

END_TICKS:

            // be careful to overflow
            var ts = new TimeSpan(day, hour, minute, second);
            var tk = TimeSpan.FromTicks(ticks);

            return((minus)
                ? ts.Negate().Subtract(tk)
                : ts.Add(tk));

ERROR:
            throw new InvalidOperationException("invalid datetime format. value:" + StringEncoding.UTF8.GetString(str.Array, str.Offset, str.Count));
        }