internal override object BaseDeserialize(TextReader r, string path) { if (JsonParserUtil.PeekIsNull(r, true, path)) { return(null); } var result = new List <TElement>(); var parens = JsonParserUtil.ReadStartArray(r); var c = JsonParserUtil.PeekNextChar(r, true); while (c != ']') { result.Add(_elementSerializer.Deserialize(r, path)); c = JsonParserUtil.PeekNextChar(r, true); if (c != ',' && c != ']') { throw new JsonDeserializationException(string.Format("Expected ']' at '{0}'", path)); } else if (c == ',') { JsonParserUtil.ReadNextChar(r, true); } } JsonParserUtil.ReadEndArray(r, parens); return(typeof(TEnumerable).IsArray ? result.ToArray() : Activator.CreateInstance(typeof(TEnumerable), result)); }
internal override object BaseDeserialize(TextReader r, string path) { if (JsonParserUtil.PeekIsNull(r, true, path)) { return(null); } var c = JsonParserUtil.ReadNextChar(r, true); if (c != '"') { throw new JsonDeserializationException(string.Format("Expected '\"' at '{0}'", path)); } var escape = false; c = JsonParserUtil.ReadNextChar(r, true); var b = new StringBuilder(); while (c != '"' || escape) { if (escape) { switch (c) { case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case 'x': c = JsonParserUtil.ReadCharCode(r, 16, 2, 2); break; case 'u': c = JsonParserUtil.ReadCharCode(r, 16, 4, 4); break; } } escape = !escape && (c == '\\'); if (!escape) { b.Append(c); } else if (char.IsDigit(JsonParserUtil.PeekNextChar(r, false))) { b.Append(JsonParserUtil.ReadCharCode(r, 8, 1, 3)); } c = JsonParserUtil.ReadNextChar(r, false); } return(b.ToString()); }