예제 #1
0
        private static KeyValuePair <String, JToken> GetNextProperty(string json, int start, out int endIndex)
        {
            int indexPointer;
            int endPropName;
            var name = GetNextPropertyName(json, start, out endPropName);

            indexPointer = endPropName;

            if (!json.TryNextChar(indexPointer, out indexPointer))
            {
                throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
            }

            int nextCharIndex;
            var nextChar = json.FindCharNotIsSpaceFollowByIndex(indexPointer, out nextCharIndex);

            if (nextCharIndex == -1 || !':'.Equals(nextChar))
            {
                throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
            }

            indexPointer = nextCharIndex;

            if (!json.TryNextChar(indexPointer, out indexPointer))
            {
                throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
            }

            var propValue = JToken.Parse(json, indexPointer, out endIndex);

            return(new KeyValuePair <string, JToken>(name, propValue));
        }
        public string MoveBehindStringAndGet()
        {
            var stringMark = CurrentChar;

            if (!IsStartOfString())
            {
                throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex);
            }
            Move();
            int endStringIndex = 0;

            for (int i = currentIndex; i < json.Length; i++)
            {
                var c = json[i];
                if ('\\'.Equals(c))
                {
                    i++;
                    continue;
                }
                if (stringMark.Equals(c))
                {
                    endStringIndex = i;
                    break;
                }
            }
            if (endStringIndex == 0)
            {
                throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex);
            }
            var stringLength = endStringIndex - currentIndex;
            var content      = json.Substring(currentIndex, stringLength);

            Move(stringLength + 1);
            return(content);
        }
        private int FindNumberLength()
        {
            int  length = 0;
            bool hasDot = false;

            for (int i = currentIndex; i < json.Length; i++)
            {
                var c = json[i];
                if ('.'.Equals(c))
                {
                    if (hasDot)
                    {
                        throw ExceptionHelpers.MakeJsonErrorException(json, i);
                    }
                    hasDot = true;
                    length++;
                }
                else if ('0' <= c && '9' >= c)
                {
                    length++;
                }
                else
                {
                    break;
                }
            }

            return(length);
        }
예제 #4
0
        //public new static JObject Parse(string json)
        //{
        //    var l_json = json.TrimStart().TrimEnd();
        //    if (!json.StartsWith("{") || !json.EndsWith("}"))
        //        throw new Exception("can not parse json from string: " + json);
        //    var propJson = l_json.Substring(1, l_json.Length - 2);

        //    var result = new JObject();

        //    return result;
        //}

        internal new static JObject Parse(string json, int start, out int endIndex)
        {
            var result = new JObject();

            endIndex = start;
            int indexPointer = start;

            if (!json.TryNextChar(indexPointer, out indexPointer))
            {
                throw ExceptionHelpers.MakeJsonErrorException(json, start);
            }

            while (true)
            {
                int endJObject;
                if (IsEndObject(json, indexPointer, out endJObject))
                {
                    indexPointer = endJObject;
                    break;
                }

                int endProperty;
                var prop = GetNextProperty(json, indexPointer, out endProperty);
                result.Add(prop);
                indexPointer = endProperty;

                if (!json.TryNextChar(indexPointer, out indexPointer))
                {
                    throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
                }

                int nextCharIndex;
                var nextChar = json.FindCharNotIsSpaceFollowByIndex(indexPointer, out nextCharIndex);
                if (nextCharIndex == -1)
                {
                    throw ExceptionHelpers.MakeJsonErrorException(json, endProperty);
                }
                indexPointer = nextCharIndex;
                if (','.Equals(nextChar))
                {
                    if (!json.TryNextChar(indexPointer, out indexPointer))
                    {
                        throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
                    }
                }
                else
                {
                    if (IsEndObject(json, indexPointer, out endJObject))
                    {
                        indexPointer = endJObject;
                        break;
                    }
                    throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
                }
            }

            endIndex = indexPointer;
            return(result);
        }
 public void Move(int step)
 {
     if (currentIndex + step >= json.Length)
     {
         throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex);
     }
     currentIndex += step;
 }
예제 #6
0
        internal new static JObject Parse(JsonStream jsonStream)
        {
            jsonStream.MoveToNextContent();
            if (!'{'.Equals(jsonStream.CurrentChar))
            {
                throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
            }
            List <KeyValuePair <string, JToken> > properties = new List <KeyValuePair <string, JToken> >();

            jsonStream.Move();
            jsonStream.MoveToNextContent();

            if (jsonStream.IsStartOfString())
            {
                while (true)
                {
                    var prop = GetNextProperty(jsonStream);
                    properties.Add(prop);

                    jsonStream.MoveToNextContent();
                    if (','.Equals(jsonStream.CurrentChar))
                    {
                        jsonStream.Move();
                        jsonStream.MoveToNextContent();
                        if (jsonStream.IsStartOfString())
                        {
                            continue;
                        }
                        else if ('}'.Equals(jsonStream.CurrentChar))
                        {
                            break;
                        }
                        else
                        {
                            throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
                        }
                    }
                    else if ('}'.Equals(jsonStream.CurrentChar))
                    {
                        break;
                    }
                    else
                    {
                        throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
                    }
                }
            }
            else if (!'}'.Equals(jsonStream.CurrentChar))
            {
                throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
            }

            jsonStream.Move();
            var answer = new JObject();

            answer.m_items = new Dictionary <string, JToken>(properties);
            return(answer);
        }
예제 #7
0
        //public new static JArray Parse(string json)
        //{
        //    var result = new JArray();

        //    return result;
        //}

        internal new static JArray Parse(string json, int start, out int endIndex)
        {
            endIndex = start;
            int indexPointer;

            if (!json.TryNextChar(start, out indexPointer))
            {
                throw ExceptionHelpers.MakeJsonErrorException(json, start);
            }
            List <JToken> items = new List <JToken>();

            while (true)
            {
                int endArrayIndex;
                if (IsEndArray(json, indexPointer, out endArrayIndex))
                {
                    indexPointer = endArrayIndex;
                    break;
                }
                int nextObjEndIndex;
                var nextObj = JToken.Parse(json, indexPointer, out nextObjEndIndex);
                indexPointer = nextObjEndIndex;
                items.Add(nextObj);

                if (!json.TryNextChar(indexPointer, out indexPointer))
                {
                    throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
                }

                int nextCharIndex;
                var nextChar = json.FindCharNotIsSpaceFollowByIndex(indexPointer, out nextCharIndex);
                if (nextCharIndex == -1)
                {
                    throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
                }
                indexPointer = nextCharIndex;
                if (','.Equals(nextChar))
                {
                    if (!json.TryNextChar(indexPointer, out indexPointer))
                    {
                        throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
                    }
                }
                else
                {
                    if (IsEndArray(json, indexPointer, out endArrayIndex))
                    {
                        indexPointer = endArrayIndex;
                        break;
                    }
                    throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer);
                }
            }
            endIndex = indexPointer;
            return(new JArray(items.ToArray()));
        }
예제 #8
0
        public static JToken ParseNew(string json)
        {
            var jsonStream = new JsonStream(json);
            var answer     = Parse(jsonStream);

            if (jsonStream.HasNextContent())
            {
                throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
            }
            return(answer);
        }
        public char MoveToNextContent()
        {
            for (int i = currentIndex; i < json.Length; i++)
            {
                if (IsContentChar(json[i]))
                {
                    currentIndex = i;
                    return(json[i]);
                }
            }

            throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex);
        }
예제 #10
0
        private static KeyValuePair <String, JToken> GetNextProperty(JsonStream jsonStream)
        {
            var propName = jsonStream.MoveBehindStringAndGet();

            jsonStream.MoveToNextContent();
            if (!':'.Equals(jsonStream.CurrentChar))
            {
                throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
            }
            jsonStream.Move();
            var propValue = JToken.Parse(jsonStream);

            return(new KeyValuePair <string, JToken>(propName, propValue));
        }
예제 #11
0
        public static JToken Parse(string json)
        {
            int endIndex;
            var answer = Parse(json, 0, out endIndex);

            if (json.TryNextChar(endIndex, out endIndex))
            {
                int nextCharIndex;
                var nextChar = json.FindCharNotIsSpaceFollowByIndex(endIndex, out nextCharIndex);
                if (nextCharIndex != -1)
                {
                    throw ExceptionHelpers.MakeJsonErrorException(json, nextCharIndex);
                }
            }

            return(answer);
        }
예제 #12
0
        internal new static JArray Parse(JsonStream jsonStream)
        {
            jsonStream.MoveToNextContent();
            if (!'['.Equals(jsonStream.CurrentChar))
            {
                throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
            }

            jsonStream.Move();
            jsonStream.MoveToNextContent();

            List <JToken> values = new List <JToken>();

            if (!']'.Equals(jsonStream.CurrentChar))
            {
                while (true)
                {
                    var value = JToken.Parse(jsonStream);
                    values.Add(value);
                    jsonStream.MoveToNextContent();
                    if (','.Equals(jsonStream.CurrentChar))
                    {
                        jsonStream.Move();
                        jsonStream.MoveToNextContent();
                        if (']'.Equals(jsonStream.CurrentChar))
                        {
                            break;
                        }
                    }
                    else if (']'.Equals(jsonStream.CurrentChar))
                    {
                        break;
                    }
                }
            }

            jsonStream.Move();
            var answer = new JArray(values);

            return(answer);
        }
예제 #13
0
        private static string GetNextPropertyName(string json, int start, out int endIndex)
        {
            for (int i = start; i < json.Length; i++)
            {
                var c = json[i];
                if (' '.Equals(c))
                {
                    continue;
                }
                else if ('"'.Equals(c) || '\''.Equals(c))
                {
                    var index = json.FindNextCharIndexFromIndex(c, i + 1);
                    var name  = json.Substring(i + 1, index - i - 1);
                    endIndex = index;
                    return(name);
                }
                else
                {
                    throw ExceptionHelpers.MakeJsonErrorException(json, i);
                }
            }

            throw ExceptionHelpers.MakeJsonErrorException(json, start);
        }
예제 #14
0
        internal static JToken Parse(string json, int start, out int endIndex)
        {
            JToken answer = null;

            endIndex = start;
            for (int i = start; i < json.Length; i++)
            {
                if (' '.Equals(json[i]))
                {
                    continue;
                }
                var c = json[i];
                if ('{'.Equals(c))
                {
                    answer = JObject.Parse(json, i, out endIndex);
                    break;
                }
                else if ('['.Equals(c))
                {
                    answer = JArray.Parse(json, i, out endIndex);
                    break;
                }
                else if ('"'.Equals(c) || '\''.Equals(c))
                {
                    var nextIndex = json.FindNextCharIndexFromIndex(c, i + 1);
                    if (nextIndex == -1)
                    {
                        throw ExceptionHelpers.MakeJsonErrorException(json, i);
                    }
                    var content = json.Substring(i + 1, nextIndex - i - 1);
                    answer   = (JToken)content;
                    endIndex = nextIndex;
                    break;
                }
                else if ('.'.Equals(c) || (c >= '0' && c <= '9'))
                {
                    var number = json.FindNumberFollowByIndex(i);
                    endIndex = i + number.Length - 1;
                    answer   = (JToken)double.Parse(number);
                    break;
                }
                else if (json.HasStringFollowByIndex("null", i))
                {
                    answer   = new JValue(null);
                    endIndex = i + 3;
                    break;
                }
                else if (json.HasStringFollowByIndex("true", i))
                {
                    answer   = (JToken)true;
                    endIndex = i + 3;
                    break;
                }
                else if (json.HasStringFollowByIndex("false", i))
                {
                    answer   = (JToken)false;
                    endIndex = i + 4;
                    break;
                }
                else
                {
                    throw ExceptionHelpers.MakeJsonErrorException(json, i);
                }
            }
            return(answer);
        }
예제 #15
0
        internal new static JValue Parse(JsonStream jsonStream)
        {
            JValue answer;

            switch (jsonStream.CurrentChar)
            {
            case 'n':
                if (jsonStream.HasNullFollow())
                {
                    answer = new JValue(null);
                    jsonStream.MoveBehindNull();
                }
                else
                {
                    throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
                }
                break;

            case 't':
                if (jsonStream.HasTrueFollow())
                {
                    answer = (JValue)true;
                    jsonStream.MoveBehindTrue();
                }
                else
                {
                    throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
                }
                break;

            case 'f':
                if (jsonStream.HasFalseFollow())
                {
                    answer = (JValue)false;
                    jsonStream.MoveBehindFalse();
                }
                else
                {
                    throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
                }
                break;

            default:
                if (jsonStream.IsStartOfString())
                {
                    var content = jsonStream.MoveBehindStringAndGet();
                    answer = (JValue)content;
                }
                else if (jsonStream.IsStartOfNumber())
                {
                    var number = jsonStream.MoveBehindNumberAndGet();
                    answer = (JValue)double.Parse(number);
                }
                else
                {
                    throw ExceptionHelpers.MakeJsonErrorException(jsonStream);
                }
                break;
            }
            return(answer);
        }