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

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

            // オブジェクトのプロパティを設定する
            while (true)
            {
                // プロパティ名を読み込む
                var token = _tokenizer.ReadToken();
                if (token.Type == JsonTokenType.RightCurlyBracket)
                {
                    break;                     // {...,}という記述か、空のオブジェクト{}
                }
                if (token.Type != JsonTokenType.String)
                {
                    throw new JsonException("JSON keys must be strings", token.Position);
                }
                _currentPropertyName = (string)token.Value;

                // ':'を読み込む
                token = _tokenizer.ReadToken();
                if (token.Type != JsonTokenType.Colon)
                {
                    throw new JsonException("':' expected", token.Position);
                }

                // 値を読み込む
                var value = DecodeElement(_tokenizer.ReadToken());

                // プロパティを設定する
                _mapper.SetProperty(_currentTarget, _currentPropertyName, value);

                // 次のトークンが','なら次のプロパティを読み込む。
                // '}'ならオブジェクトの定義を終了。
                token = _tokenizer.ReadToken();
                if (token.Type == JsonTokenType.RightCurlyBracket)
                {
                    break;
                }
                if (token.Type != JsonTokenType.Comma)
                {
                    throw new JsonException("',' or '}' expected", token.Position);
                }
            }

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

            return(obj);
        }