/// <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); }
/// <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); }