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