protected static bool ParseObject(char[] json, ref int index) { NextToken(json, ref index); while (true) { var token = LookAhead(json, index); switch (token) { case JsonToken.None: return(false); case JsonToken.Comma: NextToken(json, ref index); break; case JsonToken.CurlyClose: NextToken(json, ref index); return(true); default: { var name = ParseString(json, ref index, false); if (name == null) { return(false); } token = NextToken(json, ref index); if (token != JsonToken.Colon) { return(false); } if (!ParseValue(json, ref index, FixFarsiCharsModule.ShouldFixField(name))) { return(false); } } break; } } }
protected static string ParseString(char[] json, ref int index, bool shouldFixString) { var stringBuilder = new StringBuilder(BUILDER_CAPACITY); EatWhitespace(json, ref index); var stringToken = json[index++] == '"' ? JsonToken.StringDoubleQuotation : JsonToken.StringSingleQuotation; var complete = false; while (true) { if (index == json.Length) { break; } var c = json[index++]; if ((stringToken == JsonToken.StringDoubleQuotation && c == '"') || (stringToken == JsonToken.StringSingleQuotation && c == '\'')) { complete = true; break; } if (c == '\\') { if (index == json.Length) { break; } c = json[index++]; if (c == '"') { stringBuilder.Append('"'); } else if (c == '\\') { stringBuilder.Append('\\'); } else if (c == '/') { stringBuilder.Append('/'); } else if (c == 'b') { stringBuilder.Append('\b'); } else if (c == 'f') { stringBuilder.Append('\f'); } else if (c == 'n') { stringBuilder.Append('\n'); } else if (c == 'r') { stringBuilder.Append('\r'); } else if (c == 't') { stringBuilder.Append('\t'); } else if (c == 'u') { var remainingLength = json.Length - index; if (remainingLength >= 4) { uint codePoint; if (!UInt32.TryParse(new string(json, index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint)) { return(null); } stringBuilder.Append(Char.ConvertFromUtf32((int)codePoint)); index += 4; } else { break; } } } else { stringBuilder.Append(c); if (shouldFixString) { json[index - 1] = FixFarsiCharsModule.FixValue(c); } } } return(complete ? stringBuilder.ToString() : null); }