コード例 #1
0
        public static string DebugPrintTokens(this IJsonReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            var output = new StringBuilder();
            var stack  = new Stack <JsonToken>();

            stack.Push(JsonToken.None);
            while (reader.NextToken())
            {
                var strValue = reader.Token + (reader.Value.HasValue && reader.Value != null ? "[<" + reader.Value.Type.Name + "> " + JsonUtils.EscapeAndQuote(reader.Value.AsString).Trim('"') + "]" : "");

                if (stack.Peek() != JsonToken.Member)
                {
                    var endingTokenIndent = (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray ? -1 : 0);
                    output.Append(Environment.NewLine);
                    for (var i = 0; i < System.Linq.Enumerable.Count(stack, t => t != JsonToken.Member && t != JsonToken.None) + endingTokenIndent; i++)
                    {
                        output.Append("\t");
                    }
                }
                else
                {
                    output.Append(" ");
                }

                output.Append(strValue);

                if (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray || stack.Peek() == JsonToken.Member)
                {
                    stack.Pop();
                }
                if (reader.Token == JsonToken.BeginObject || reader.Token == JsonToken.BeginArray || reader.Token == JsonToken.Member)
                {
                    stack.Push(reader.Token);
                }
            }
            return(output.ToString());
        }
コード例 #2
0
        public bool NextToken()
        {
            var start    = 0;
            var len      = 0;
            var quoted   = false;
            var isMember = false;

            if (!this.NextLexeme(ref start, ref len, ref quoted, ref isMember))             // end of stream
            {
                this.token         = JsonToken.EndOfStream;
                this.lazyValue.Raw = null;
                return(false);
            }

            this.lazyValue.ClearValue();
            this.lazyValue.SetBufferBounds(start, len);
            if (len == 1 && !quoted && this.buffer[start] == SIGNIFICANT_BEGIN_ARRAY)
            {
                this.token = JsonToken.BeginArray;
            }
            else if (len == 1 && !quoted && this.buffer[start] == SIGNIFICANT_BEGIN_OBJECT)
            {
                this.token = JsonToken.BeginObject;
            }
            else if (len == 1 && !quoted && this.buffer[start] == SIGNIFICANT_END_ARRAY)
            {
                this.token = JsonToken.EndOfArray;
            }
            else if (len == 1 && !quoted && this.buffer[start] == SIGNIFICANT_END_OBJECT)
            {
                this.token = JsonToken.EndOfObject;
            }
            else if (len == 4 && !quoted && this.LookupAt(this.buffer, start, len, "null"))
            {
                this.token = JsonToken.Null;
            }
            else if (len == 4 && !quoted && this.LookupAt(this.buffer, start, len, "true"))
            {
                this.token         = JsonToken.Boolean;
                this.lazyValue.Raw = true;
            }
            else if (len == 5 && !quoted && this.LookupAt(this.buffer, start, len, "false"))
            {
                this.token         = JsonToken.Boolean;
                this.lazyValue.Raw = false;
            }
            else if (quoted && this.LookupAt(this.buffer, start, 6, "/Date(") && this.LookupAt(this.buffer, start + len - 2, 2, ")/"))
            {
                var ticks = JsonUtils.StringToInt64(this.buffer.GetChars(), this.buffer.Offset + start + 6, len - 8);

                this.token = JsonToken.DateTime;
                var dateTime = new DateTime(ticks * 0x2710L + JsonUtils.UnixEpochTicks, DateTimeKind.Utc);
                this.lazyValue.Raw = dateTime;
            }
            else if (!quoted && IsNumber(this.buffer, start, len))
            {
                this.token = JsonToken.Number;
                this.lazyValue.SetAsLazyString(false);
            }
            else
            {
                this.token = isMember ? JsonToken.Member : JsonToken.StringLiteral;
                this.lazyValue.SetAsLazyString(quoted);
            }

            this.buffer.FixateLater(start + len + (quoted ? 1 : 0));

            return(true);
        }