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); } }
DateTime IJsonFormatterSpecReader <DateTime, JsonReaderUtf8> .DeserializeSpec(JsonReaderUtf8 reader, IJsonFormatterResolver formatterResolver) { throw new NotImplementedException(); }
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)); }