public static byte[] PrettyPrintByteArray(string json)
        {
            var reader = new JsonReaderUtf8(Encoding.UTF8.GetBytes(json));
            var writer = new JsonWriterUtf8(MemoryPool.GetBuffer());

            WritePrittyPrint(reader, writer, 0);
            return(writer.ToUtf8ByteArray());
        }
        public static byte[] PrettyPrintByteArray(byte[] json, int offset)
        {
            var reader = new JsonReaderUtf8(json, offset);
            var writer = new JsonWriterUtf8(MemoryPool.GetBuffer());

            WritePrittyPrint(reader, writer, 0);
            return(writer.ToUtf8ByteArray());
        }
        public static T Deserialize <T>(byte[] bytes, int offset, IJsonFormatterResolver resolver)
        {
            if (resolver == null)
            {
                resolver = JsonSerializer.DefaultResolver;
            }

            var reader    = new JsonReaderUtf8(bytes, offset);
            var formatter = resolver.GetFormatterWithVerify <T>();

            return(formatter.Deserialize(reader, resolver));
        }
        public static T Deserialize <T>(Stream stream, IJsonFormatterResolver resolver)
        {
            if (resolver == null)
            {
                resolver = JsonSerializer.DefaultResolver;
            }

#if NETSTANDARD && !NET45
            var ms = stream as MemoryStream;
            if (ms != null)
            {
                ArraySegment <byte> buf2;
                if (ms.TryGetBuffer(out buf2))
                {
                    // when token is number, can not use from pool(can not find end line).
                    var token = new JsonReaderUtf8(buf2.Array, buf2.Offset).GetCurrentJsonToken();
                    if (token == JsonToken.Number)
                    {
                        var buf3 = new byte[buf2.Count];
                        Buffer.BlockCopy(buf2.Array, buf2.Offset, buf3, 0, buf3.Length);
                        return(Deserialize <T>(buf3, 0, resolver));
                    }

                    return(Deserialize <T>(buf2.Array, buf2.Offset, resolver));
                }
            }
#endif
            {
                var buf = MemoryPool.GetBuffer();
                var len = FillFromStream(stream, ref buf);

                // when token is number, can not use from pool(can not find end line).
                var token = new JsonReaderUtf8(buf).GetCurrentJsonToken();
                if (token == JsonToken.Number)
                {
                    buf = ByteArrayUtil.FastCloneWithResize(buf, len);
                }

                return(Deserialize <T>(buf, resolver));
            }
        }
        public static async System.Threading.Tasks.Task <T> DeserializeAsync <T>(Stream stream, IJsonFormatterResolver resolver)
        {
            if (resolver == null)
            {
                resolver = JsonSerializer.DefaultResolver;
            }

            var buffer = BufferPool.Default.Rent();
            var buf    = buffer;

            try
            {
                int length = 0;
                int read;
                while ((read = await stream.ReadAsync(buf, length, buf.Length - length).ConfigureAwait(false)) > 0)
                {
                    length += read;
                    if (length == buf.Length)
                    {
                        ByteArrayUtil.FastResize(ref buf, length * 2);
                    }
                }

                // when token is number, can not use from pool(can not find end line).
                var token = new JsonReaderUtf8(buf).GetCurrentJsonToken();
                if (token == JsonToken.Number)
                {
                    buf = ByteArrayUtil.FastCloneWithResize(buf, length);
                }

                return(Deserialize <T>(buf, resolver));
            }
            finally
            {
                BufferPool.Default.Return(buffer);
            }
        }