예제 #1
0
        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());
        }