示例#1
0
        public override unsafe object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return(null);
            }

            var result = new Parameters();

            do
            {
                reader.Read();
                if (reader.TokenType == JsonToken.EndObject)
                {
                    return(result);
                }
                if (reader.TokenType != JsonToken.PropertyName)
                {
                    throw new InvalidOperationException("Expected PropertyName, Got " + reader.TokenType);
                }

                var key = (string)reader.Value;
                reader.Read();// read the value

                var v = reader.Value;
                if (v is string s)
                {
                    fixed(char *pBuffer = s)
                    {
                        var r = LazyStringParser.TryParseTimeForQuery(pBuffer, s.Length, out var dt, out var dto,
#if FEATURE_DATEONLY_TIMEONLY_SUPPORT
                                                                      out var @do,
                                                                      out var to,
#endif
                                                                      properlyParseThreeDigitsMilliseconds: true);

                        switch (r)
                        {
                        case LazyStringParser.Result.Failed:
                            break;

                        case LazyStringParser.Result.DateTime:
                            v = dt;
                            break;

                        case LazyStringParser.Result.DateTimeOffset:
                            v = dto;
                            break;

#if FEATURE_DATEONLY_TIMEONLY_SUPPORT
                        case LazyStringParser.Result.DateOnly:
                            v = @do;
                            break;

                        case LazyStringParser.Result.TimeOnly:
                            v = to;
                            break;
#endif
                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                }

                result[key] = v;
            } while (true);
        }