public JsonObject Put(string label, JsonArray value) { return(PutArray(label, value)); }
// 戻り値は次のインデックス位置 public int Parse(string source, int offset) { if (string.IsNullOrEmpty(source) == true || source.Length == 0) { // 構文エラー return(-1); } //---------------------------------- if (m_Entities == null) { m_Entities = new Dictionary <string, object>(); } else { m_Entities.Clear(); } //---------------------------------- int l = source.Length; offset = Skip(source, offset); if (offset >= l) { return(offset); // 終了(結果 null) } if (source[offset] != '{') { // 構文エラー return(-1); } offset++; //----------------------------------------------------- string label = ""; object value = null; int p = 0; int w = 0; int f = -1; char c; int i, o = -1, m; bool escape = false; for (i = offset; i < l; i++) { if (p == 0) { // 名 if (w == 0) { // Label 前 i = Skip(source, i); if (i >= l) { // 構文エラー({ が } で閉じられていない) m_Entities.Clear(); return(-1); } c = source[i]; // ラベルの外側 if (c == '}') { // いきなり終了 f = i + 1; break; } else if (c == ',') { // 項目省略 // JsonObject の場合は何もしない } else if (c == '"') { o = i; w = 1; // キーワードの内側 } else // if( c == ' ' || c == '\r' || c == '\n' || c == '\t' ) // { // // 読み飛ばし // } // else { // 構文エラー(不正な文字) m_Entities.Clear(); return(-1); } } else if (w == 1) { // Label 中 c = source[i]; // ラベルの内側 if (c == '\\') { // エスケープ escape = true; } else { if (escape == true) { // エスケープ解除 escape = false; } else { if (c == '"') { m = (i - 1) - (o + 1) + 1; if (m < 1) { // 構文エラー(ラベル名が定義されていない) m_Entities.Clear(); return(-1); } label = source.Substring(o + 1, m); w = 2; // キーワードの外側 } } } } else if (w == 2) { // Label 後 i = Skip(source, i); if (i >= l) { // 構文エラー({ が } で閉じられていない) m_Entities.Clear(); return(-1); } c = source[i]; // 名が終わった if (c == ':') { p = 1; // 値へ w = 0; } else // if( c == ' ' || c == '\r' || c == '\n' || c == '\t' ) // { // // 読み飛ばし // } // else { // 構文エラー(不正な文字) m_Entities.Clear(); return(-1); } } } else { // 値 if (w == 0) { // Value 前 i = Skip(source, i); if (i >= l) { // 構文エラー({ が } で閉じられていない) m_Entities.Clear(); return(-1); } c = source[i]; if (c == ',' || c == '}') { // 値は空 value = ""; if (m_Entities.ContainsKey(label) == true) { m_Entities.Remove(label); } m_Entities.Add(label, value); if (c == '}') { // 無事終了 f = i + 1; break; } p = 0; // 名へ w = 0; } else if (c == '{') { // 値は JsonObject JsonObject jo = new JsonObject(); i = jo.Parse(source, i); if (i < 0 || i >= l) { // 構文エラー({ が } で閉じられていない) m_Entities.Clear(); return(-1); } i--; value = jo; w = 3; // 閉じへ } else if (c == '[') { // 値は JsonArray JsonArray ja = new JsonArray(); i = ja.Parse(source, i); if (i < 0 || i >= l) { // 構文エラー({ が } で閉じられていない) m_Entities.Clear(); return(-1); } i--; value = ja; w = 3; // 閉じへ } else // if( c == ' ' || c == '\r' || c == '\n' || c == '\t' ) // { // // 読み飛ばし // } // else { // 数値か文字 o = i; if (c != '"') { // 数値 w = 1; } else { // 文字 w = 2; } } } else if (w == 1) { // Value 中(数値) // 数値 c = source[i]; if (c == ',' || c == '}' || c < 0x21 || c > 0x7E) { // 数値切り出し m = i - o; string s; if (m > 0) { s = source.Substring(o, m); } else { s = ""; } value = s; i--; // 1文字前へ w = 3; // 閉じへ } } else if (w == 2) { // Value 中(文字) // 文字 c = source[i]; if (c == '\\') { // エスケープ escape = true; } else { if (escape == true) { // エスケープ解除 escape = false; } else { if (c == '"') { // 文字列切り出し m = (i + 1) - o; string s; if (m > 0) { s = source.Substring(o, m); } else { s = "\"\""; } value = s; w = 3; // 閉じへ } } } } else if (w == 3) { // Value 後 i = Skip(source, i); if (i >= l) { // 構文エラー({ が } で閉じられていない) m_Entities.Clear(); return(-1); } c = source[i]; if (c == ',' || c == '}') { // 次の項目へ if (m_Entities.ContainsKey(label) == true) { m_Entities.Remove(label); } m_Entities.Add(label, value); if (c == '}') { // 無事終了 f = i + 1; break; } p = 0; // 名へ w = 0; } else // if( c == ' ' || c == '\r' || c == '\n' || c == '\t' ) // { // // 読み飛ばし // } // else { // 構文エラー(不正な文字) m_Entities.Clear(); return(-1); } } } } if (f < 0) { // 構文エラー m_Entities.Clear(); return(-1); } // 成功 return(f); }
//----------------------------------- // 短縮版 public JsonObject Put(string label, object value) { if (value != null) { if (value is bool) { value = (( bool )value).ToString().ToLower(); } else if (value is int) { value = (( int )value).ToString(); } else if (value is long) { value = (( long )value).ToString(); } else if (value is float) { value = (( float )value).ToString(); } else if (value is double) { value = (( double )value).ToString(); } else if (value is string) { value = "\"" + ( string )value + "\""; } else if (value is bool[]) { value = new JsonArray().PutBoolean(( bool[] )value); } else if (value is int[]) { value = new JsonArray().PutInt(( int[] )value); } else if (value is long[]) { value = new JsonArray().PutLong(( long[] )value); } else if (value is float[]) { value = new JsonArray().PutFloat(( float[] )value); } else if (value is Double[]) { value = new JsonArray().PutDouble(( double[] )value); } else if (value is string[]) { value = new JsonArray().PutString(( string[] )value); } else if (value is JsonObject[]) { value = new JsonArray().PutObject(( JsonObject[] )value); } else if (value is JsonArray[]) { value = new JsonArray().PutArray(( JsonArray[] )value); } } if (m_Entities.ContainsKey(label) == false) { m_Entities.Add(label, value); } else { m_Entities[label] = value; } return(this); }