예제 #1
0
파일: JSON_obj.cs 프로젝트: huangss0/GTS0
        /// <summary>
        /// Add new attribute to attribute dictionary
        /// </summary>
        /// <param name="name">name of the attribute</param>
        /// <param name="obj_val">attribute value</param>
        public bool AddAttr(string name, JSON_obj obj_val)
        {
            if (name == null)
            {
                return(false);
            }

            this.attr_dic[name] = obj_val;
            return(true);
        }
예제 #2
0
파일: JSON_obj.cs 프로젝트: huangss0/GTS0
        /// <summary>
        /// Construct this object from string
        /// </summary>
        public bool Read_from_str(string str_json, bool transformQuote)
        {
            if (str_json == null)
            {
                return(false);
            }
            else
            {
                this.ClearAttr();
            }

            JSON_parser parser = new JSON_parser();

            parser.str = str_json;

            ParseState        currState = ParseState.None;
            Stack <StackItem> stack     = new Stack <StackItem>();

            while ((currState = parser.Next()) != ParseState.None)
            {
                /*Fot testing*/
                //if (currState == ParseState.Value_str) Console.WriteLine("state:" + currState + "    str:" + parser.val_str);
                //else if (currState == ParseState.Value_num) Console.WriteLine("state:" + currState + "    num:" + parser.val_num);
                //else if (currState == ParseState.Between) continue;
                //else Console.WriteLine("state:" + currState);

                if (currState == ParseState.Between)
                {
                    continue;
                }
                StackItem item = new StackItem(currState, parser.val_str, parser.val_num);

                if (item.state == ParseState.Obj_begin)
                {
                    if (stack.Count < 1)
                    {
                        item.jsObj = this;
                    }
                    else
                    {
                        item.jsObj = new JSON_obj();
                    }

                    stack.Push(item);
                }
                else if (item.state == ParseState.List_start)
                {
                    if (stack.Count < 1)
                    {
                        return(false);
                    }

                    if (stack.Peek().state == ParseState.Obj_begin)
                    {
                        return(false);
                    }
                    else
                    {
                        item.jsObj = new JSON_obj(new List <JSON_obj>());
                        stack.Push(item);
                    }
                }
                else if (item.state == ParseState.Value_num)
                {
                    if (stack.Count < 1)
                    {
                        return(false);
                    }

                    if (stack.Peek().state == ParseState.Obj_begin)
                    {
                        stack.Push(item);
                    }
                    else
                    {
                        string key = null;
                        if (stack.Peek().state == ParseState.Value_str)
                        {
                            key = stack.Pop().val_str;
                            stack.Peek().jsObj.AddAttr(key, new JSON_obj(item.val_num));
                        }
                        else if (stack.Peek().state == ParseState.Value_num)
                        {
                            key = stack.Pop().val_num.ToString();
                            stack.Peek().jsObj.AddAttr(key, new JSON_obj(item.val_num));
                        }
                        else if (stack.Peek().state == ParseState.List_start)
                        {
                            stack.Peek().jsObj.obj_list.Add(new JSON_obj(item.val_num));
                        }
                    }
                }
                else if (item.state == ParseState.Value_str)
                {
                    if (stack.Count < 1)
                    {
                        continue;
                    }

                    if (stack.Peek().state == ParseState.Obj_begin)
                    {
                        stack.Push(item);
                    }
                    else
                    {
                        if (stack.Peek().state == ParseState.Value_str)
                        {
                            string key = this.ToOriStr_JSON(stack.Pop().val_str, transformQuote);
                            string val = this.ToOriStr_JSON(item.val_str, transformQuote);
                            stack.Peek().jsObj.AddAttr(key, new JSON_obj(val));
                        }
                        else if (stack.Peek().state == ParseState.Value_num)
                        {
                            string key = stack.Pop().val_num.ToString();
                            string val = this.ToOriStr_JSON(item.val_str, transformQuote);
                            stack.Peek().jsObj.AddAttr(key, new JSON_obj(val));
                        }
                        else if (stack.Peek().state == ParseState.List_start)
                        {
                            string val = this.ToOriStr_JSON(item.val_str, transformQuote);
                            stack.Peek().jsObj.obj_list.Add(new JSON_obj(val));
                        }
                    }
                }
                else if (item.state == ParseState.Obj_end)
                {
                    if (stack.Count < 1)
                    {
                        return(false);
                    }

                    while (stack.Peek().state != ParseState.Obj_begin)
                    {
                        stack.Pop();
                    }
                    if (stack.Count == 1)
                    {
                        break;                  //find root JSON_obj
                    }
                    string   key       = null;
                    JSON_obj value_obj = stack.Pop().jsObj;//wrap current obj into a JSON_obj

                    if (stack.Peek().state == ParseState.Value_str)
                    {
                        key = stack.Pop().val_str;
                        stack.Peek().jsObj.AddAttr(key, value_obj);
                    }
                    else if (stack.Peek().state == ParseState.Value_num)
                    {
                        key = stack.Pop().val_num.ToString();
                        stack.Peek().jsObj.AddAttr(key, value_obj);
                    }
                    else if (stack.Peek().state == ParseState.List_start)
                    {
                        stack.Peek().jsObj.obj_list.Add(value_obj);
                    }
                }
                else if (item.state == ParseState.List_end)
                {
                    if (stack.Count < 1)
                    {
                        return(false);
                    }

                    while (stack.Peek().state != ParseState.List_start)
                    {
                        stack.Pop();
                    }

                    string   key       = null;
                    JSON_obj value_obj = stack.Pop().jsObj;//wrap current list into a JSON object
                    if (stack.Count < 1)
                    {
                        return(false);
                    }

                    if (stack.Peek().state == ParseState.Value_str)
                    {
                        key = stack.Pop().val_str;
                        stack.Peek().jsObj.AddAttr(key, value_obj);
                    }
                    else if (stack.Peek().state == ParseState.Value_num)
                    {
                        key = stack.Pop().val_num.ToString();
                        stack.Peek().jsObj.AddAttr(key, value_obj);
                    }
                    else if (stack.Peek().state == ParseState.List_start)
                    {
                        stack.Peek().jsObj.obj_list.Add(value_obj);
                    }
                }
            }

            return(true);
        }