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); }