Exemplo n.º 1
0
 public JsonObject Put(string label, JsonArray value)
 {
     return(PutArray(label, value));
 }
Exemplo n.º 2
0
        // 戻り値は次のインデックス位置
        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);
        }
Exemplo n.º 3
0
        //-----------------------------------
        // 短縮版

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