Exemplo n.º 1
0
        /// <summary>
        /// 配列をデコードする。
        /// </summary>
        /// <returns>デコード結果のオブジェクト</returns>
        object DecodeArray()
        {
            // 現在のオブジェクトとプロパティ名を退避
            var prevTarget       = _currentTarget;
            var prevPropertyName = _currentPropertyName;

            // オブジェクトを生成
            var obj = _mapper.CreateArray(_currentTarget, _currentPropertyName);

            // 配列の場合、プロパティ名はなし
            _currentTarget       = obj;
            _currentPropertyName = null;

            // 各要素を読み込む
            while (true)
            {
                // 要素を読み込む
                var token = _tokenizer.ReadToken();
                if (token.Type == JsonTokenType.RightSquareBracket)
                {
                    break;                     // [...,]という記述か、空の配列[]
                }
                var value = DecodeElement(token);

                // 配列に要素を追加
                _mapper.AddElement(obj, value);

                // 次のトークンが','なら次の要素を読み込む。']'なら配列の定義を終了
                token = _tokenizer.ReadToken();
                if (token.Type == JsonTokenType.RightSquareBracket)
                {
                    break;
                }
                if (token.Type != JsonTokenType.Comma)
                {
                    throw new JsonException("',' or ']' expected", token.Position);
                }
            }

            // 現在のオブジェクトとプロパティ名を戻す
            _currentTarget       = prevTarget;
            _currentPropertyName = prevPropertyName;

            return(obj);
        }