Ejemplo n.º 1
0
 public ParseException(string msg, Reader reader)
     : base(msg)
 {
     this.JsonString = reader.JsonString;
     this.CharAt = reader.At;
     this.LineAt = reader.LineAt;
     this.ColumnAt = reader.ColumnAt;
 }
Ejemplo n.º 2
0
        public JToken Parse(string jsonString, int at = 0)
        {
            var reader = new Reader(jsonString, at);
            JArray targetArr = null;
            JToken result = null;
            JObject targetObj = null;
            var stack = new Stack<JToken>();
            reader.OnObjectStart = (name,colAt,lineAt) =>
            {

                if (result == null)
                {
                    result = targetObj = new JObject();

                }
                else
                {
                    var newTarget = new JObject();
                    if (targetObj != null)
                    {
                        targetObj[name] = newTarget;
                        stack.Push(targetObj);
                    }
                    else if (targetArr != null && name == null)
                    {
                        targetArr.Push(newTarget);
                        stack.Push(targetArr);

                    }
                    targetObj = newTarget;
                    targetArr = null;

                }

            };
            reader.OnArrayStart = (name) =>
            {

                if (result == null)
                {
                    result = targetArr = new JArray();
                }
                else
                {
                    var newTarget = new JArray();
                    if (targetObj != null)
                    {
                        targetObj[name] = newTarget;
                        stack.Push(targetObj);
                    }
                    else if (targetArr != null && name == null)
                    {
                        targetArr.Push(newTarget);
                        stack.Push(targetArr);
                    }
                    targetArr = newTarget;
                    targetObj = null;

                }

            };
            reader.OnObjectEnd = () =>
            {

                if (targetObj != result && targetArr != result)
                {
                    var target = stack.Pop();
                    if ((targetArr = target as JArray) == null)
                    {
                        if ((targetObj = target as JObject) == null)
                        {
                            throw new ParseException("不期望的}", reader.JsonString, reader.At, reader.LineAt,
                                reader.ColumnAt);
                        }
                    }
                    else targetObj = null;
                }

                return true;
            };
            reader.OnArrayEnd = () =>
            {

                if (targetObj != result && targetArr != result)
                {
                    var target = stack.Pop();
                    if ((targetArr = target as JArray) == null)
                    {
                        if ((targetObj = target as JObject) == null)
                        {
                            throw new ParseException("不期望的]", reader.JsonString, reader.At, reader.LineAt,
                                reader.ColumnAt);
                        }
                    }
                    else targetObj = null;
                }
                return true;
            };
            reader.OnFunctionFound = (name, value) =>
            {
                if (targetObj != null) targetObj[name] = new JFunction(value);
                else if (targetArr != null) targetArr.Push(new JFunction(value));
                else if (name == null) result = new JFunction(value);
                else
                {
                    result = targetObj = new JObject();
                    targetObj[name] = new JFunction(value);
                }
                return true;
            };
            reader.OnKeyValueFound = (name, valueString) => {
                JToken value = ParseValueString(valueString);
                if (targetObj != null) targetObj[name] = value;
                else if (targetArr != null) targetArr.Push(value);
                else if (name == null) result = value;
                else
                {
                    result = targetObj = new JObject();
                    targetObj[name] = value;
                }

                return true;
            };
            reader.Read();
            return result;
        }