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