Solution46
CJsonDocument.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// JSONドキュメントクラス実装ファイル
4 ///
5 /// JSONドキュメントクラス実装ファイルです。
6 ///
7 /// $Id: CJsonDocument.cpp 245 2019-03-20 15:03:41Z admin $
8 /// $Date: 2019-03-21 00:03:41 +0900 (2019/03/21 (木)) $
9 /// $Author: admin $
10 ///
11 /// @attention なし
12 
13 #pragma managed( push, off )
14 
15 //=============================================================================
16 // インクルードファイル
17 #include <CJsonDocument.h>
18 #include <CJsonObject.h>
19 #include <CJsonArray.h>
20 #include <CJsonString.h>
21 #include <CJsonNumber.h>
22 #include <CJsonFixed.h>
23 #include <CJsonPair.h>
24 #include <CJsonValue.h>
25 #include <CJsonContainer.h>
26 #include <CJsonToken.h>
27 #include <CStringStream.h>
28 #include <LibUtility.h>
29 
30 //=============================================================================
31 // インクルード実装ファイル
32 #include <CArray.hpp>
33 
34 //=============================================================================
35 // JSONライブラリ名前空間
36 namespace LibJson {
37  //=========================================================================
38  // JSONドキュメントクラス
39  //=========================================================================
40  // 構築子と解体子
41  //-------------------------------------------------------------------------
42  // コンストラクタ
43  CJsonDocument::CJsonDocument( CJson* pcJson ) noexcept
44  // メンバ変数初期化
45  : m_pcJsonRoot( pcJson )
46  , m_pcJsonCurrent( m_pcJsonRoot )
47  {}
48 
49  //-------------------------------------------------------------------------
50  // デストラクタ
52  // クリアする
53  ClearDocument();
54  }
55 
56  //=========================================================================
57  // 公開関数
58  //-------------------------------------------------------------------------
59  // ルートJSONクラス設定関数
60  bool CJsonDocument::SetRootJson( CJson* pcJson ) noexcept {
61  // 処理ブロック
62  bool result = false;
63  do {
64  // JSONクラスポインタを調べる
65  if ( nullptr == pcJson ) {
66  // 失敗!
67  break;
68  }
69  // ルートJSONクラスを調べる
70  else if ( pcJson != pcJson->GetJsonRoot() ) {
71  // 失敗!
72  break;
73  }
74 
75  // クリアする
76  ClearDocument();
77 
78  // JSONクラスポインタを設定する
79  m_pcJsonRoot = m_pcJsonCurrent = pcJson;
80 
81  // 成功!
82  result = true;
83  } while ( false );
84 
85  // 実行結果を返す
86  return result;
87  }
88 
89  //-------------------------------------------------------------------------
90  // カレントJSONクラス設定関数
91  bool CJsonDocument::SetCurrentJson( CJson* pcJson ) noexcept {
92  // 処理ブロック
93  bool result = false;
94  do {
95  // JSONクラスポインタを調べる
96  if ( nullptr == pcJson ) {
97  // 失敗!
98  break;
99  }
100 
101  // ルートJSONクラスを取得する
102  CJson* pcJsonRoot = pcJson->GetJsonRoot();
103 
104  // ルートJSONクラスポインタを調べる
105  if ( nullptr == m_pcJsonRoot ) {
106  // ルートJSONクラスを設定する
107  if ( !SetRootJson( pcJsonRoot ) ) {
108  // 失敗!
109  break;
110  }
111  }
112  // ルートJSONクラスを調べる
113  else if ( m_pcJsonRoot != pcJsonRoot ) {
114  // 失敗!
115  break;
116  }
117 
118  // カレントJSONクラスポインタを設定する
119  m_pcJsonCurrent = pcJson;
120 
121  // 成功!
122  result = true;
123  } while ( false );
124 
125  // 実行結果を返す
126  return result;
127  }
128 
129  //-------------------------------------------------------------------------
130  // クリア関数
132  // ルートJSONクラスを削除する
133  delete m_pcJsonRoot;
134  m_pcJsonRoot = nullptr;
135  m_pcJsonCurrent = nullptr;
136  }
137 
138  //-------------------------------------------------------------------------
139  // コンパクト化関数
141  // 処理ブロック
142  bool result = false;
143  do {
144  // ルートJSONクラスポインタを調べる
145  if ( nullptr != m_pcJsonRoot ) {
146  // ルートJSONクラスをコンパクト化する
147  if ( !m_pcJsonRoot->CompactJson() ) {
148  // 失敗!
149  break;
150  }
151  }
152 
153  // 成功!
154  result = true;
155  } while ( false );
156 
157  // 実行結果を返す
158  return result;
159  }
160 
161  //-------------------------------------------------------------------------
162  // JSONドキュメント入力関数
163  bool CJsonDocument::InputDocument( CStream& rcStream ) noexcept {
164  // 処理ブロック
165  bool result = false;
166  do {
167  // ストリームポインタを取得する
168  int nPoint = rcStream.GetStreamPoint();
169 
170  // 処理ブロック
171  do {
172  // クリアする
173  ClearDocument();
174 
175  // JSONペアを作成する
176  m_pcJsonRoot = CJsonPair::CreateInputJson( rcStream, nullptr );
177  if ( nullptr == m_pcJsonRoot ) {
178  // JSONバリューを作成する
179  m_pcJsonRoot = CJsonValue::CreateInputJson( rcStream, nullptr );
180  if ( nullptr == m_pcJsonRoot ) {
181  // 失敗!
182  break;
183  }
184  }
185 
186  // カレントJSONクラスを設定する
188 
189  // 成功!
190  result = true;
191  }while ( false );
192 
193  // 実行結果を調べる
194  if ( !result ) {
195  // ストリームポインタを復元する
196  rcStream.SetStreamPoint( nPoint );
197  }
198  } while ( false );
199 
200  // 実行結果を返す
201  return result;
202  }
203 
204  //-------------------------------------------------------------------------
205  // JSONドキュメント出力関数
206  bool CJsonDocument::OutputDocument( CStreamOut& rcStreamOut ) noexcept {
207  // 処理ブロック
208  bool result = false;
209  do {
210  // ルートJSONクラスポインタを調べる
211  if ( nullptr != m_pcJsonRoot ) {
212  // ルートJSONクラスを出力する
213  if ( !m_pcJsonRoot->OutputJson( rcStreamOut ) ) {
214  // 失敗!
215  break;
216  }
217  // 改行を出力する
218  else if ( !rcStreamOut.OutputNewLine() ) {
219  // 失敗!
220  break;
221  }
222  }
223 
224  // 成功!
225  result = true;
226  } while ( false );
227 
228  // 実行結果を返す
229  return result;
230  }
231 
232  //-------------------------------------------------------------------------
233  // カレントJSONクラス削除関数
235  // 処理ブロック
236  bool result = false;
237  do {
238  // カレントJSONクラスポインタを調べる
239  if ( m_pcJsonRoot == m_pcJsonCurrent ) {
240  // クリアする
241  ClearDocument();
242  }
243  // JSONクラスを削除する
244  else if ( !DeleteJson( m_pcJsonCurrent ) ) {
245  // 失敗!
246  break;
247  }
248 
249  // 成功!
250  result = true;
251  } while ( false );
252 
253  // 実行結果を返す
254  return result;
255  }
256 
257  //-------------------------------------------------------------------------
258  // カレントパス取得関数
259  bool CJsonDocument::GetCurrentPath( CString& rcPath ) noexcept {
260  // 処理ブロック
261  bool result = false;
262  do {
263  // カレントJSONクラスのJSONパスを取得する
264  result = GetJsonPath( rcPath, m_pcJsonCurrent );
265  } while ( false );
266 
267  // 実行結果を返す
268  return result;
269  }
270 
271  //-------------------------------------------------------------------------
272  // カレントパス設定関数
273  bool CJsonDocument::SetCurrentPath( wchar_t const* pszPath ) noexcept {
274  // 処理ブロック
275  bool result = false;
276  do {
277  // カレントJSONクラスのJSONパスを検索する
278  CJson* pcJson = FindJsonPath( pszPath, m_pcJsonCurrent );
279  if ( nullptr == pcJson ) {
280  // 失敗!
281  break;
282  }
283 
284  // カレントJSONクラスポインタを設定する
285  m_pcJsonCurrent = pcJson;
286 
287  // 成功!
288  result = true;
289  } while ( false );
290 
291  // 実行結果を返す
292  return result;
293  }
294 
295  //-------------------------------------------------------------------------
296  // カレント設定値文字列取得関数
297  bool CJsonDocument::GetCurrentSetValue( CString& rcValue, bool bClassName, bool bQuotes ) noexcept {
298  // 処理ブロック
299  bool result = false;
300  do {
301  // カレントJSONクラスのJSON設定値文字列を取得する
302  result = GetJsonSetValue( rcValue, m_pcJsonCurrent, bClassName, bQuotes );
303  } while ( false );
304 
305  // 実行結果を返す
306  return result;
307  }
308 
309  //-------------------------------------------------------------------------
310  // カレント設定値文字列設定関数
311  bool CJsonDocument::SetCurrentSetValue( wchar_t const* pszValue ) noexcept {
312  // 処理ブロック
313  bool result = false;
314  do {
315  // カレントJSONクラスのJSON設定値文字列を設定する
316  CJson* pcJson = m_pcJsonCurrent;
317  if ( !SetJsonSetValue( pszValue, pcJson ) ) {
318  // 失敗!
319  break;
320  }
321  // カレントJSONクラスポインタを調べる
322  else if ( m_pcJsonRoot == m_pcJsonCurrent ) {
323  // クリアする
324  ClearDocument();
325 
326  // ルートJSONクラスポインタを設定する
327  m_pcJsonRoot = pcJson;
328  }
329 
330  // カレントJSONクラスポインタを設定する
331  m_pcJsonCurrent = pcJson;
332 
333  // 成功!
334  result = true;
335  } while ( false );
336 
337  // 実行結果を返す
338  return result;
339  }
340 
341  //-------------------------------------------------------------------------
342  // JSONパス作成関数
343  bool CJsonDocument::CreatePath( wchar_t const* pszPath ) noexcept {
344  // 処理ブロック
345  bool result = false;
346  do {
347  // カレントJSONクラスポインタを調べる
348  CString cPath( L"/" );
349  if ( nullptr != m_pcJsonCurrent ) {
350  // カレントJSONパスを取得する
351  GetCurrentPath( cPath );
352  }
353 
354  // カレントJSONクラス相対でJSONパスを作成する
355  CJson* pcJson = m_pcJsonCurrent;
356  if ( !CreateJsonPath( pszPath, pcJson ) || ( nullptr == pcJson ) ) {
357  // 失敗!
358  break;
359  }
360 
361  // ルートJSONクラスポインタを調べる
362  CJson* pcRoot = pcJson->GetJsonRoot();
363  if ( ( nullptr == m_pcJsonRoot ) || ( pcRoot != m_pcJsonRoot->GetJsonRoot() ) ) {
364  // クリアする
365  ClearDocument();
366  }
367 
368  // ルートJSONクラスポインタを設定する
369  m_pcJsonRoot = pcRoot;
370 
371  // カレントJSONパスを検索する
373  if ( nullptr == m_pcJsonCurrent ) {
374  // カレントJSONクラスポインタを設定する
376  }
377 
378  // 成功!
379  result = true;
380  } while ( false );
381 
382  // 実行結果を返す
383  return result;
384  }
385 
386  //=========================================================================
387  // 静的公開関数
388  //-------------------------------------------------------------------------
389  // JSONパス取得関数
390  bool CJsonDocument::GetJsonPath( CString& rcPath, CJson* pcJson ) noexcept {
391  // 処理ブロック
392  bool result = false;
393  do {
394  // JSONクラスポインタを調べる
395  if ( nullptr == pcJson ) {
396  // 失敗!
397  break;
398  }
399 
400  // 巡回する
401  rcPath = L"";
402  CJson* pcParent = nullptr;
403  for ( ; nullptr != pcJson; pcJson = pcParent ) {
404  // 親JSONクラスを取得する
405  pcParent = pcJson->GetJsonParent();
406  if ( nullptr != pcParent ) {
407  // 親JSONクラス種別を調べる
408  if ( pcParent->IsJsonPair() ) {
409  // JSON文字列を取得する
410  CJsonString* pcJsonString = pcParent->GetJsonString();
411  if ( nullptr == pcJsonString ) {
412  // 失敗!
413  break;
414  }
415 
416  // 文字列を取得する
417  wchar_t const* pszString = *pcJsonString;
418  if ( nullptr == pszString ) {
419  // 空文字列を設定する
420  pszString = L"";
421  }
422 
423  // 二重引用符で括るか判断する
424  size_t len = ::wcslen( pszString );
425  if ( ( 0 == len ) || ( nullptr != ::wcschr( pszString, L' ' ) ) ) {
426  // 名前を二重引用符で括って挿入する
427  if ( !rcPath.Insert( 0, CString().Format( L"\"%s\"", pszString ) ) ) {
428  // 失敗!
429  break;
430  }
431  }
432  // 名前を挿入する
433  else if ( !rcPath.Insert( 0, pszString ) ) {
434  // 失敗!
435  break;
436  }
437 
438  // セパレータを挿入する
439  rcPath.Insert( 0, L'/' );
440  }
441  // 親JSONクラス種別を調べる
442  else if ( pcParent->IsJsonArray() ) {
443  // JSON配列を取得する
444  CJsonArray* pcJsonArray = pcParent->GetJsonArray();
445  if ( nullptr == pcJsonArray ) {
446  // 失敗!
447  break;
448  }
449 
450  // 巡回する
451  int nCount = pcJsonArray->GetCount();
452  int nIndex = 0;
453  for ( ;; ++nIndex ) {
454  // 調べる
455  if ( nCount <= nIndex ) {
456  // 失敗!
457  nIndex = -1;
458  break;
459  }
460  // JSONクラスポインタを調べる
461  else if ( pcJson == ( *pcJsonArray )[ nIndex ] ) {
462  // 終了!
463  break;
464  }
465  }
466 
467  // インデックスを調べる
468  if ( 0 > nIndex ) {
469  // 失敗!
470  break;
471  }
472  // 配列添え字を挿入する
473  else if ( !rcPath.Insert( 0, CString().Format( L"[%d]", nIndex ) ) ) {
474  // 失敗!
475  break;
476  }
477  }
478  // 親JSONクラス種別を調べる
479  else if ( pcParent->IsJsonPair() ) {
480  // 子JSONクラス種別を調べる
481  if ( pcJson->IsJsonObject() ) {
482  // セパレータを挿入する
483  if ( !rcPath.Insert( 0, L'/' ) ) {
484  // 失敗!
485  break;
486  }
487  }
488  }
489  }
490 
491  // 親JSONクラスポインタを調べる
492  if ( nullptr == pcParent ) {
493  // 文字数を調べる
494  wchar_t ch = L'\0';
495  if ( 0 < rcPath.GetCount() ) {
496  // 先頭の文字を取得する
497  ch = rcPath[ 0 ];
498  }
499 
500  // 先頭の文字を調べる
501  if ( L'/' != ch ) {
502  // セパレータを挿入する
503  rcPath.Insert( 0, L'/' );
504  }
505 
506  // 成功!
507  result = true;
508  break;
509  }
510  }
511  } while ( false );
512 
513  // 実行結果を返す
514  return result;
515  }
516 
517  //-------------------------------------------------------------------------
518  // JSONパス検索関数
519  CJson* CJsonDocument::FindJsonPath( wchar_t const* pszPath, CJson* pcJson ) noexcept {
520  // 処理ブロック
521  CJson* result = nullptr;
522  do {
523  // パス文字列ポインタを調べる
524  if ( nullptr == pszPath ) {
525  // 失敗!
526  break;
527  }
528  // JSONクラスポインタを調べる
529  else if ( nullptr == pcJson ) {
530  // 失敗!
531  break;
532  }
533 
534  // 文字列ストリームを作成する
535  CStringStream cStream( pszPath );
536 
537  // 巡回する
539  for ( int nToken = 0; nullptr != pcJson; ) {
540  // ストリーム終端か調べる
541  if ( cStream.IsStreamEnd() ) {
542  // 成功!
543  result = pcJson;
544  break;
545  }
546 
547  // JSONパストークンを入力する
548  EJsonPathToken ePrev = eToken;
549  CString cToken;
550  eToken = InputPathToken( cStream, cToken );
551  ++nToken;
552 
553  // JSONパストークン種別を調べる
554  if ( EJsonPathToken::Separator == eToken ) {
555  // 直前のJSONパストークン種別を調べる
556  if ( EJsonPathToken::Separator == ePrev ) {
557  // 失敗!
558  break;
559  }
560  // トークン入力カウントを調べる
561  else if ( 1 == nToken ) {
562  // ルートJSONクラスを取得する
563  pcJson = pcJson->GetJsonRoot();
564  }
565  }
566  // 直前のJSONパストークン種別を調べる
567  else if ( ( EJsonPathToken::Dot == ePrev ) || ( EJsonPathToken::DotDot == ePrev ) ) {
568  // 失敗!
569  break;
570  }
571  // JSONパストークン種別を調べる
572  else if ( EJsonPathToken::Dot == eToken ) {
573  // 何もしない
574  }
575  // JSONパストークン種別を調べる
576  else if ( EJsonPathToken::DotDot == eToken ) {
577  // 親JSONクラスを取得する
578  pcJson = pcJson->GetJsonParent();
579  }
580  // JSONパストークン種別を調べる
581  else if ( EJsonPathToken::Name == eToken ) {
582  // JSONペアを取得する
583  CJsonPair* pcJsonPair = pcJson->GetJsonPair();
584  if ( nullptr == pcJsonPair ) {
585  // JSONオブジェクトを取得する
586  CJsonObject* pcJsonObject = pcJson->GetJsonObject();
587  if ( nullptr == pcJsonObject ) {
588  // 失敗!
589  break;
590  }
591 
592  // JSONペアを取得する
593  pcJsonPair = pcJsonObject->GetJsonPair( cToken );
594  if ( nullptr == pcJsonPair ) {
595  // 失敗!
596  break;
597  }
598  }
599 
600  // JSONバリューを取得する
601  pcJson = pcJsonPair->GetJsonValue();
602  }
603  // JSONパストークン種別を調べる
604  else if ( EJsonPathToken::Index == eToken ) {
605  // JSON配列を取得する
606  CJsonArray* pcJsonArray = pcJson->GetJsonArray();
607  if ( nullptr == pcJsonArray ) {
608  // 失敗!
609  break;
610  }
611 
612  // インデックスを取得する
613  int nIndex = static_cast< int >( ::wcstol( cToken, nullptr, 10 ) );
614 
615  // JSONエレメントを取得する
616  pcJson = pcJsonArray->GetJsonElement( nIndex );
617  }
618  else {
619  // 失敗!
620  break;
621  }
622  }
623  } while ( false );
624 
625  // 実行結果を返す
626  return result;
627  }
628 
629  //-------------------------------------------------------------------------
630  // JSON設定値文字列取得関数
631  bool CJsonDocument::GetJsonSetValue( CString& rcValue, CJson* pcJson, bool bClassName, bool bQuotes ) noexcept {
632  // 処理ブロック
633  bool result = false;
634  do {
635  // JSONクラスポインタを調べる
636  if ( nullptr == pcJson ) {
637  // 失敗!
638  break;
639  }
640 
641  // JSONクラス種別を調べる
642  if ( pcJson->IsJsonToken() ) {
643  // JSONトークンを取得する
644  CJsonToken* pcJsonToken = pcJson->GetJsonToken();
645  if ( nullptr == pcJsonToken ) {
646  // 失敗!
647  break;
648  }
649 
650  // 文字列を取得する
651  wchar_t const* pszString = *pcJsonToken;
652  if ( nullptr == pszString ) {
653  // 空文字列を設定する
654  pszString = L"";
655  }
656 
657  // JSONクラス種別を調べる
658  if ( bQuotes && pcJson->IsJsonString() ) {
659  // 二重引用符で括ってトークン文字列を追加する
660  if ( !rcValue.Push( CString().Format( L"\"%s\"", pszString ) ) ) {
661  // 失敗!
662  break;
663  }
664  }
665  // トークン文字列を追加する
666  else if ( !rcValue.Push( pszString ) ) {
667  // 失敗!
668  break;
669  }
670  }
671  // JSONクラス種別を調べる
672  else if ( pcJson->IsJsonContainer() ) {
673  // JSONコンテナクラスを取得する
674  CJsonContainer* pcJsonContainer = pcJson->GetJsonContainer();
675  if ( nullptr == pcJsonContainer ) {
676  // 失敗!
677  break;
678  }
679  // JSONクラスエレメント数を調べる
680  else if ( 0 == pcJsonContainer->GetCount() ) {
681  // JSONクラス種別を調べる
682  if ( pcJson->IsJsonObject() ) {
683  // 空オブジェクト文字列を追加する
684  if ( !rcValue.Push( L"{}" ) ) {
685  // 失敗!
686  break;
687  }
688  }
689  else if ( pcJson->IsJsonArray() ) {
690  // 空配列文字列を追加する
691  if ( !rcValue.Push( L"[]" ) ) {
692  // 失敗!
693  break;
694  }
695  }
696  else {
697  // 失敗!
698  break;
699  }
700  }
701  // JSONクラス種別を調べる
702  else if ( pcJson->IsJsonObject() ) {
703  // オブジェクト文字列を追加する
704  if ( !rcValue.Push( L"{...}" ) ) {
705  // 失敗!
706  break;
707  }
708  }
709  else if ( pcJson->IsJsonArray() ) {
710  // 配列文字列を追加する
711  if ( !rcValue.Push( L"[...]" ) ) {
712  // 失敗!
713  break;
714  }
715  }
716  else {
717  // 失敗!
718  break;
719  }
720  }
721  // JSONクラス種別を調べる
722  else if ( pcJson->IsJsonPair() ) {
723  // JSON文字列のJSON設定値文字列を取得する
724  if ( !GetJsonSetValue( rcValue, pcJson->GetJsonString(), false ) ) {
725  // 失敗!
726  break;
727  }
728  // 区切り文字列を追加する
729  else if ( !rcValue.Push( L": " ) ) {
730  // 失敗!
731  break;
732  }
733  // JSONバリューのJSON設定値文字列を取得する
734  else if ( !GetJsonSetValue( rcValue, pcJson->GetJsonValue(), false ) ) {
735  // 失敗!
736  break;
737  }
738  }
739  else {
740  // 失敗!
741  break;
742  }
743 
744  // JSONクラス名取得フラグを調べる
745  if ( bClassName ) {
746  // JSONクラス種別を調べる
747  wchar_t const* pszString = L"";
748  switch ( pcJson->GetJsonClass() ) {
749  case CJson::EJsonClass::JsonObject: pszString = L" ( JSONオブジェクト )"; break;
750  case CJson::EJsonClass::JsonArray: pszString = L" ( JSON配列 )"; break;
751  case CJson::EJsonClass::JsonString: pszString = L" ( JSON文字列 )"; break;
752  case CJson::EJsonClass::JsonNumber: pszString = L" ( JSON数値 )"; break;
753  case CJson::EJsonClass::JsonFixed: pszString = L" ( JSON固定値 )"; break;
754  case CJson::EJsonClass::JsonPair: pszString = L" ( JSONペア )"; break;
755  }
756 
757  // JSONクラス種別文字列を追加する
758  rcValue += pszString;
759  }
760 
761  // 成功!
762  result = true;
763  } while ( false );
764 
765  // 実行結果を返す
766  return result;
767  }
768 
769  //-------------------------------------------------------------------------
770  // JSON設定値設定関数
771  bool CJsonDocument::SetJsonSetValue( wchar_t const* pszValue, CJson*& rpcJson ) noexcept {
772  // 文字列ストリームでJSON設定値を設定する
773  CStringStream cStream( pszValue );
774  return SetJsonSetValueByStream( cStream, rpcJson );
775  }
776 
777  //-------------------------------------------------------------------------
778  // JSON設定値ストリーム設定関数
779  bool CJsonDocument::SetJsonSetValueByStream( CStream& rcStream, CJson*& rpcJson ) noexcept {
780  // 処理ブロック
781  bool result = false;
782  do {
783  // JSONクラスポインタを調べる
784  CJson* pcParent = nullptr;
785  if ( nullptr != rpcJson ) {
786  // 親JSONクラスを取得する
787  pcParent = rpcJson->GetJsonParent();
788  }
789 
790  // 最初の親JSONクラスを保存する
791  CJson* pcParentFirst = pcParent;
792 
793  // 親JSONクラスポインタを調べる
794  CJson* pcJsonNew = nullptr;
795  if ( nullptr == pcParent ) {
796  // JSONペアを新規作成する
797  pcJsonNew = CJsonPair::CreateInputJson( rcStream, pcParent );
798  if ( nullptr == pcJsonNew ) {
799  // JSONバリューを新規作成する
800  pcJsonNew = CJsonValue::CreateInputJson( rcStream, pcParent );
801  if ( nullptr == pcJsonNew ) {
802  // 失敗!
803  break;
804  }
805  }
806  }
807  // 親JSONクラス種別を調べる
808  else if ( pcParent->IsJsonObject() ) {
809  // JSONペアを新規作成する
810  pcJsonNew = CJsonPair::CreateInputJson( rcStream, pcParent );
811  if ( nullptr == pcJsonNew ) {
812  // 失敗!
813  break;
814  }
815  }
816  // 親JSONクラス種別を調べる
817  else if ( pcParent->IsJsonArray() ) {
818  // JSONバリューを新規作成する
819  pcJsonNew = CJsonValue::CreateInputJson( rcStream, pcParent );
820  if ( nullptr == pcJsonNew ) {
821  // 失敗!
822  break;
823  }
824  }
825  // 親JSONクラス種別を調べる
826  else if ( pcParent->IsJsonPair() ) {
827  // JSONバリューを新規作成する
828  pcJsonNew = CJsonValue::CreateInputJson( rcStream, pcParent );
829  if ( nullptr == pcJsonNew ) {
830  // 失敗!
831  break;
832  }
833  }
834  else {
835  // 失敗!
836  break;
837  }
838 
839  // 処理ブロック
840  do {
841  // 親JSONクラスポインタを調べる
842  if ( nullptr == pcParent ) {
843  // JSONクラスポインタを設定する
844  rpcJson = pcJsonNew;
845  }
846  // 親JSONクラス種別を調べる
847  else if ( pcParent->IsJsonContainer() ) {
848  // JSONコンテナを取得する
849  CJsonContainer* pcJsonContainer = pcParent->GetJsonContainer();
850  if ( nullptr == pcJsonContainer ) {
851  // 失敗!
852  break;
853  }
854 
855  // JSONエレメントインデックスを取得する
856  int nIndex = pcJsonContainer->Find( rpcJson );
857  if ( 0 > nIndex ) {
858  // 失敗!
859  break;
860  }
861 
862  // JSONエレメントを取得する
863  CJson* pcJsonElement = pcJsonContainer->GetJsonElement( nIndex );
864  if ( nullptr != pcJsonElement ) {
865  // JSONエレメントを削除する
866  delete pcJsonElement;
867  }
868 
869  // JSONエレメントを設定する
870  if ( !pcJsonContainer->SetJsonElement( nIndex, pcJsonNew ) ) {
871  // 失敗!
872  break;
873  }
874 
875  // 最初の親JSONクラス種別を調べる
876  if ( pcParentFirst->IsJsonPair() ) {
877  // JSONクラスポインタを設定する
878  rpcJson = pcJsonNew->GetJsonValue();
879  }
880  else {
881  // JSONクラスポインタを設定する
882  rpcJson = pcJsonNew;
883  }
884  }
885  // 親JSONクラス種別を調べる
886  else if ( pcParent->IsJsonPair() ) {
887  // JSONペアを取得する
888  CJsonPair* pcJsonPair = pcParent->GetJsonPair();
889  if ( nullptr == pcJsonPair ) {
890  // 失敗!
891  break;
892  }
893 
894  // JSONバリューを設定する
895  if ( !pcJsonPair->SetJsonValue( pcJsonNew->GetJsonValue() ) ) {
896  // 失敗!
897  break;
898  }
899 
900  // JSONクラスポインタを設定する
901  rpcJson = pcJsonNew;
902  }
903  else {
904  // 失敗!
905  break;
906  }
907 
908  // 成功!
909  result = true;
910  } while ( false );
911 
912  // 実行結果を調べる
913  if ( !result ) {
914  // 新規作成JSONクラスを削除する
915  delete pcJsonNew;
916  }
917  } while ( false );
918 
919  // 実行結果を返す
920  return result;
921  }
922 
923  //-------------------------------------------------------------------------
924  // JSONクラス削除関数
925  bool CJsonDocument::DeleteJson( CJson*& rpcJson ) noexcept {
926  // 処理ブロック
927  bool result = false;
928  do {
929  // JSONクラスポインタを調べる
930  if ( nullptr == rpcJson ) {
931  // 失敗!
932  break;
933  }
934 
935  // 親JSONクラスを取得する
936  CJson* pcParent = rpcJson->GetJsonParent();
937  if ( nullptr != pcParent ) {
938  // 親JSONクラス種別を調べる
939  if ( pcParent->IsJsonContainer() ) {
940  // JSONコンテナクラスを取得する
941  CJsonContainer* pcJsonContainer = pcParent->GetJsonContainer();
942  if ( nullptr == pcJsonContainer ) {
943  // 失敗!
944  break;
945  }
946 
947  // エレメントインデックスを取得する
948  int nIndex = pcJsonContainer->Find( rpcJson );
949  if ( 0 > nIndex ) {
950  // 失敗!
951  break;
952  }
953  // エレメントを削除する
954  else if ( !pcJsonContainer->Remove( nIndex ) ) {
955  // 失敗!
956  break;
957  }
958 
959  // JSONクラスを削除する
960  delete rpcJson;
961 
962  // エレメント数を調べる
963  int nCount = pcJsonContainer->GetCount();
964  if ( 0 == nCount ) {
965  // JSONクラスポインタを設定する
966  rpcJson = pcParent;
967  }
968  else {
969  // エレメント数を調べる
970  if ( nCount <= nIndex ) {
971  // インデックスを設定する
972  nIndex = ( nCount - 1 );
973  }
974 
975  // JSONクラスポインタを設定する
976  rpcJson = ( *pcJsonContainer )[ nIndex ];
977  }
978  }
979  // 親JSONクラス種別を調べる
980  else if ( pcParent->IsJsonPair() ) {
981  // 親JSONクラスを削除する
982  if ( !DeleteJson( pcParent ) ) {
983  // 失敗!
984  break;
985  }
986 
987  // JSONクラスポインタを設定する
988  rpcJson = pcParent;
989  }
990  else {
991  // 失敗!
992  break;
993  }
994  }
995  else {
996  // JSONクラスを削除する
997  delete rpcJson;
998 
999  // JSONクラスポインタをクリアする
1000  rpcJson = nullptr;
1001  }
1002 
1003  // 成功!
1004  result = true;
1005  } while ( false );
1006 
1007  // 実行結果を返す
1008  return result;
1009  }
1010 
1011  //-------------------------------------------------------------------------
1012  // JSONパス作成関数
1013  bool CJsonDocument::CreateJsonPath( wchar_t const* pszPath, CJson*& rpcJson ) noexcept {
1014  // 処理ブロック
1015  bool result = false;
1016  do {
1017  // JSONパス文字列ポインタを調べる
1018  if ( nullptr == pszPath ) {
1019  // 失敗!
1020  break;
1021  }
1022 
1023  // 文字列ストリームを作成する
1024  CStringStream cStream( pszPath );
1025 
1026  // 巡回する
1028  int nToken = 0;
1029  for ( ;; ) {
1030  // ストリーム終端か調べる
1031  if ( cStream.IsStreamEnd() ) {
1032  // 成功!
1033  result = true;
1034  break;
1035  }
1036 
1037  // JSONクラスポインタを調べる
1038  CJson* pcParent = nullptr;
1039  if ( nullptr != rpcJson ) {
1040  // 親JSONクラスを取得する
1041  pcParent = rpcJson->GetJsonParent();
1042  }
1043 
1044  // JSONパストークンを入力する
1045  EJsonPathToken ePrev = eToken;
1046  CString cToken;
1047  eToken = InputPathToken( cStream, cToken, true );
1048  ++nToken;
1049 
1050  // JSONパストークン種別を調べる
1051  if ( EJsonPathToken::Separator == eToken ) {
1052  // 直前のJSONパストークン種別を調べる
1053  if ( EJsonPathToken::Separator == ePrev ) {
1054  // 失敗!
1055  break;
1056  }
1057  // トークン入力カウントを調べる
1058  else if ( 1 == nToken ) {
1059  // JSONクラスポインタを調べる
1060  if ( nullptr != rpcJson ) {
1061  // ルートJSONクラスを取得する
1062  rpcJson = rpcJson->GetJsonRoot();
1063  }
1064  }
1065  }
1066  // 直前のJSONパストークン種別を調べる
1067  else if ( ( EJsonPathToken::Dot == ePrev ) || ( EJsonPathToken::DotDot == ePrev ) ) {
1068  // 失敗!
1069  break;
1070  }
1071  // JSONパストークン種別を調べる
1072  else if ( EJsonPathToken::Dot == eToken ) {
1073  // 何もしない
1074  }
1075  // JSONパストークン種別を調べる
1076  else if ( EJsonPathToken::DotDot == eToken ) {
1077  // 親JSONクラスを調べる
1078  if ( nullptr == pcParent ) {
1079  // 失敗!
1080  break;
1081  }
1082  // 親JSONクラス種別を調べる
1083  else if ( pcParent->IsJsonPair() ) {
1084  // 親の親JSONクラスを取得する
1085  CJson* pcParentParent = pcParent->GetJsonParent();
1086  if ( nullptr != pcParentParent ) {
1087  // 親JSONクラスポインタを設定する
1088  pcParent = pcParentParent;
1089  }
1090  }
1091 
1092  // JSONクラスポインタを設定する
1093  rpcJson = pcParent;
1094  }
1095  // JSONパストークン種別を調べる
1096  else if ( EJsonPathToken::Name == eToken ) {
1097  // JSONクラスポインタを調べる
1098  CJsonObject* pcJsonObject = nullptr;
1099  CJsonPair* pcJsonPair = nullptr;
1100  if ( nullptr == rpcJson ) {
1101  // JSONオブジェクトを作成する
1102  pcJsonObject = new CJsonObject( nullptr );
1103  if ( nullptr == pcJsonObject ) {
1104  // 失敗!
1105  break;
1106  }
1107  }
1108  // JSONクラス種別を調べる
1109  else if ( rpcJson->IsJsonObject() ) {
1110  // JSONオブジェクトを取得する
1111  pcJsonObject = rpcJson->GetJsonObject();
1112  if ( nullptr == pcJsonObject ) {
1113  // 失敗!
1114  break;
1115  }
1116  }
1117  // 親JSONクラスポインタを調べる
1118  else if ( nullptr == pcParent ) {
1119  // JSONオブジェクトを作成する
1120  pcJsonObject = new CJsonObject( nullptr );
1121  if ( nullptr == pcJsonObject ) {
1122  // 失敗!
1123  break;
1124  }
1125  // JSONクラス種別を調べる
1126  else if ( rpcJson->IsJsonPair() ) {
1127  // JSONペアを取得する
1128  pcJsonPair = rpcJson->GetJsonPair();
1129  if ( nullptr == pcJsonPair ) {
1130  // 失敗!
1131  break;
1132  }
1133  // JSONペアを追加する
1134  else if ( !pcJsonObject->Push( pcJsonPair ) ) {
1135  // 失敗!
1136  break;
1137  }
1138 
1139  // 親JSONクラスを設定する
1140  rpcJson->SetJsonParent( pcJsonObject );
1141  }
1142  }
1143  // 親JSONクラス種別を調べる
1144  else if ( pcParent->IsJsonObject() ) {
1145  // JSONオブジェクトを取得する
1146  pcJsonObject = pcParent->GetJsonObject();
1147  if ( nullptr == pcJsonObject ) {
1148  // 失敗!
1149  break;
1150  }
1151  }
1152  // 親JSONクラス種別を調べる
1153  else if ( pcParent->IsJsonArray() ) {
1154  // 親JSON配列を取得する
1155  CJsonArray* pcParentArray = pcParent->GetJsonArray();
1156  if ( nullptr == pcParentArray ) {
1157  // 失敗!
1158  break;
1159  }
1160 
1161  // エレメントインデックスを取得する
1162  int nIndex = pcParentArray->Find( rpcJson );
1163  if ( 0 > nIndex ) {
1164  // 失敗!
1165  break;
1166  }
1167 
1168  // JSONオブジェクトを作成する
1169  pcJsonObject = new CJsonObject( pcParentArray );
1170  if ( nullptr == pcJsonObject ) {
1171  // 失敗!
1172  break;
1173  }
1174 
1175  // JSONバリューを削除する
1176  delete ( *pcParentArray )[ nIndex ];
1177 
1178  // JSONバリューを設定する
1179  ( *pcParentArray )[ nIndex ] = pcJsonObject;
1180  }
1181  // 親JSONクラス種別を調べる
1182  else if ( pcParent->IsJsonPair() ) {
1183  // 親JSONペアを取得する
1184  CJsonPair* pcParentPair = pcParent->GetJsonPair();
1185  if ( nullptr == pcParentPair ) {
1186  // 失敗!
1187  break;
1188  }
1189 
1190  // JSONオブジェクトを作成する
1191  pcJsonObject = new CJsonObject( pcParentPair );
1192  if ( nullptr == pcJsonObject ) {
1193  // 失敗!
1194  break;
1195  }
1196 
1197  // JSONバリューを設定する
1198  pcParentPair->SetJsonValue( pcJsonObject );
1199  }
1200  else {
1201  // 失敗!
1202  break;
1203  }
1204 
1205  // JSONペアを取得する
1206  pcJsonPair = pcJsonObject->GetJsonPair( cToken );
1207  if ( nullptr == pcJsonPair ) {
1208  // JSONペアを作成する
1209  pcJsonPair = new CJsonPair( pcJsonObject, cToken );
1210  if ( nullptr == pcJsonPair ) {
1211  // 失敗!
1212  break;
1213  }
1214  // JSONペアを追加する
1215  else if ( !pcJsonObject->Push( pcJsonPair ) ) {
1216  // 失敗!
1217  break;
1218  }
1219  }
1220 
1221  // JSONバリューを取得する
1222  rpcJson = pcJsonPair->GetJsonValue();
1223  }
1224  // JSONパストークン種別を調べる
1225  else if ( EJsonPathToken::Index == eToken ) {
1226  // JSONクラスポインタを調べる
1227  CJsonArray* pcJsonArray = nullptr;
1228  if ( nullptr == rpcJson ) {
1229  // JSON配列を作成する
1230  pcJsonArray = new CJsonArray( nullptr );
1231  if ( nullptr == pcJsonArray ) {
1232  // 失敗!
1233  break;
1234  }
1235  }
1236  // JSONクラス種別を調べる
1237  else if ( rpcJson->IsJsonArray() ) {
1238  // JSON配列を取得する
1239  pcJsonArray = rpcJson->GetJsonArray();
1240  if ( nullptr == pcJsonArray ) {
1241  // 失敗!
1242  break;
1243  }
1244  }
1245  // 親JSONクラスポインタを調べる
1246  else if ( nullptr == pcParent ) {
1247  // JSONクラス種別を調べる
1248  if ( rpcJson->IsJsonArray() ) {
1249  // JSON配列を取得する
1250  pcJsonArray = rpcJson->GetJsonArray();
1251  if ( nullptr == pcJsonArray ) {
1252  // 失敗!
1253  break;
1254  }
1255  }
1256  else {
1257  // JSON配列を作成する
1258  pcJsonArray = new CJsonArray( nullptr );
1259  if ( nullptr == pcJsonArray ) {
1260  // 失敗!
1261  break;
1262  }
1263  }
1264  }
1265  // 親JSONクラス種別を調べる
1266  else if ( pcParent->IsJsonArray() ) {
1267  // 親JSON配列を取得する
1268  CJsonArray* pcParentArray = pcParent->GetJsonArray();
1269  if ( nullptr == pcParentArray ) {
1270  // 失敗!
1271  break;
1272  }
1273 
1274  // エレメントインデックスを取得する
1275  int nIndex = pcParentArray->Find( rpcJson );
1276  if ( 0 > nIndex ) {
1277  // 失敗!
1278  break;
1279  }
1280 
1281  // JSON配列を作成する
1282  pcJsonArray = new CJsonArray( pcParentArray );
1283  if ( nullptr == pcJsonArray ) {
1284  // 失敗!
1285  break;
1286  }
1287 
1288  // JSONバリューを削除する
1289  delete ( *pcParentArray )[ nIndex ];
1290 
1291  // JSONバリューを設定する
1292  ( *pcParentArray )[ nIndex ] = pcJsonArray;
1293  }
1294  // 親JSONクラス種別を調べる
1295  else if ( pcParent->IsJsonPair() ) {
1296  // 親JSONペアを取得する
1297  CJsonPair* pcParentPair = pcParent->GetJsonPair();
1298  if ( nullptr == pcParentPair ) {
1299  // 失敗!
1300  break;
1301  }
1302 
1303  // JSON配列を作成する
1304  pcJsonArray = new CJsonArray( pcParentPair );
1305  if ( nullptr == pcJsonArray ) {
1306  // 失敗!
1307  break;
1308  }
1309 
1310  // JSONバリューを設定する
1311  pcParentPair->SetJsonValue( pcJsonArray );
1312  }
1313  else {
1314  // 失敗!
1315  break;
1316  }
1317 
1318  // インデックスを調べる
1319  int nIndex = static_cast< int >( ::wcstol( cToken, nullptr, 10 ) );
1320  if ( pcJsonArray->GetCount() <= nIndex ) {
1321  // JSONエレメント数を拡張する
1322  if ( !pcJsonArray->ExtendJsonElementCount( nIndex + 1 ) ) {
1323  // 失敗!
1324  break;
1325  }
1326  }
1327 
1328  // JSONエレメントを取得する
1329  rpcJson = ( *pcJsonArray )[ nIndex ];
1330  }
1331  // JSONパストークン種別を調べる
1332  else if ( EJsonPathToken::Equal == eToken ) {
1333  // JSON設定値を設定する
1334  if ( !SetJsonSetValueByStream( cStream, rpcJson ) ) {
1335  // 失敗!
1336  break;
1337  }
1338  }
1339  else {
1340  // 失敗!
1341  break;
1342  }
1343  }
1344  } while ( false );
1345 
1346  // 実行結果を返す
1347  return result;
1348  }
1349 
1350  //-------------------------------------------------------------------------
1351  // JSONパスリスト取得関数
1352  bool CJsonDocument::GetJsonPathList( CString& rcPathList, CJson* pcJson ) noexcept {
1353  // 処理ブロック
1354  bool result = false;
1355  do {
1356  // JSONクラスポインタを調べる
1357  if ( nullptr == pcJson ) {
1358  // 失敗!
1359  break;
1360  }
1361  // JSONクラス種別を調べる
1362  else if ( pcJson->IsJsonContainer() ) {
1363  // JSONコンテナを取得する
1364  CJsonContainer* pcJsonContainer = pcJson->GetJsonContainer();
1365  if ( nullptr == pcJsonContainer ) {
1366  // 失敗!
1367  break;
1368  }
1369 
1370  // JSONクラスエレメント数を調べる
1371  int nCount = pcJsonContainer->GetCount();
1372  if ( 0 == nCount ) {
1373  // JSONパスを取得する
1374  CString cPath;
1375  if ( !GetJsonPath( cPath, pcJson ) ) {
1376  // 失敗!
1377  break;
1378  }
1379  // パスリストに追加する
1380  else if ( !rcPathList.Push( cPath ) ) {
1381  // 失敗!
1382  break;
1383  }
1384 
1385  // JSON設定値文字列を取得する
1386  CString cValue;
1387  if ( !GetJsonSetValue( cValue, pcJson, true ) ) {
1388  // 失敗!
1389  break;
1390  }
1391  // パスリストに追加する
1392  else if ( !rcPathList.Push( CString().Format( L" = %s\n", cValue.GetBuffer() ) ) ) {
1393  // 失敗!
1394  break;
1395  }
1396  }
1397  else {
1398  // 巡回する
1399  int nIndex = 0;
1400  for ( ; nCount > nIndex; ++nIndex ) {
1401  // JSONクラス要素を取得する
1402  CJson* pcJsonElement = ( *pcJsonContainer )[ nIndex ];
1403 
1404  // パスリストを取得する
1405  if ( !GetJsonPathList( rcPathList, pcJsonElement ) ) {
1406  // 失敗!
1407  nIndex = -1;
1408  break;
1409  }
1410  }
1411 
1412  // インデックスを調べる
1413  if ( 0 > nIndex ) {
1414  // 失敗!
1415  break;
1416  }
1417  }
1418  }
1419  // JSONクラス種別を調べる
1420  else if ( pcJson->IsJsonToken() ) {
1421  // JSONパスを取得する
1422  CString cPath;
1423  if ( !GetJsonPath( cPath, pcJson ) ) {
1424  // 失敗!
1425  break;
1426  }
1427  // パスリストに追加する
1428  else if ( !rcPathList.Push( cPath ) ) {
1429  // 失敗!
1430  break;
1431  }
1432 
1433  // JSON設定値文字列を取得する
1434  CString cValue;
1435  if ( !GetJsonSetValue( cValue, pcJson, true ) ) {
1436  // 失敗!
1437  break;
1438  }
1439  // パスリストに追加する
1440  else if ( !rcPathList.Push( CString().Format( L" = %s\n", cValue.GetBuffer() ) ) ) {
1441  // 失敗!
1442  break;
1443  }
1444  }
1445  // JSONクラス種別を調べる
1446  else if ( pcJson->IsJsonPair() ) {
1447  // パスリストを取得する
1448  if ( !GetJsonPathList( rcPathList, pcJson->GetJsonValue() ) ) {
1449  // 失敗!
1450  break;
1451  }
1452  }
1453  else {
1454  // 失敗!
1455  break;
1456  }
1457 
1458  // 成功!
1459  result = true;
1460  } while ( false );
1461 
1462  // 実行結果を返す
1463  return result;
1464  }
1465 
1466  //=========================================================================
1467  // 静的限定公開関数
1468  //-------------------------------------------------------------------------
1469  // JSONパストークン入力関数
1470  CJsonDocument::EJsonPathToken CJsonDocument::InputPathToken( CStream& rcStream, CString& rcString, bool bEqual ) noexcept {
1471  // 処理ブロック
1473  do {
1474  // ストリームポインタを取得する
1475  int nPoint = rcStream.GetStreamPoint();
1476 
1477  // 1文字入力する
1478  wchar_t ch;
1479  if ( !rcStream.InputChar( ch ) ) {
1480  // 失敗!
1481  break;
1482  }
1483  // 文字コードを調べる
1484  else if ( L'/' == ch ) {
1485  // JSONパスセパレータを設定する
1486  rcString.Push( ch );
1487  result = EJsonPathToken::Separator;
1488  }
1489  // 文字コードを調べる
1490  else if ( L'.' == ch ) {
1491  // JSONパスドットを設定する
1492  rcString.Push( ch );
1493  result = EJsonPathToken::Dot;
1494 
1495  // ストリームポインタを取得する
1496  nPoint = rcStream.GetStreamPoint();
1497 
1498  // 1文字入力する
1499  if ( rcStream.InputChar( ch ) ) {
1500  // 文字コードを調べる
1501  if ( L'.' == ch ) {
1502  // JSONパス二重ドットを設定する
1503  rcString.Push( ch );
1504  result = EJsonPathToken::DotDot;
1505  }
1506  else {
1507  // ストリームポインタを設定する
1508  rcStream.SetStreamPoint( nPoint );
1509  }
1510  }
1511  }
1512  // 文字コードを調べる
1513  else if ( L'[' == ch ) {
1514  // 空白をスキップする
1515  rcStream.SkipSpace();
1516 
1517  // JSON整数を取得する
1518  CJsonToken cJsonToken( nullptr );
1519  if ( !cJsonToken.InputJsonInt( rcStream ) ) {
1520  // 失敗!
1521  break;
1522  }
1523 
1524  // 空白をスキップする
1525  rcStream.SkipSpace();
1526 
1527  // 1文字スキップする
1528  if ( !rcStream.SkipChar( L']' ) ) {
1529  // 失敗!
1530  break;
1531  }
1532 
1533  // JSONパスインデックスを設定する
1534  rcString.Push( cJsonToken );
1535  result = EJsonPathToken::Index;
1536  }
1537  // 文字コードを調べる
1538  else if ( bEqual && ( L'=' == ch ) ) {
1539  // 空白をスキップする
1540  rcStream.SkipSpace();
1541 
1542  // JSONパス等号を設定する
1543  rcString.Push( L'=' );
1544  result = EJsonPathToken::Equal;
1545  }
1546  // 文字コードを調べる
1547  else if ( bEqual && ( 0 != ::iswspace( ch ) ) ) {
1548  // 空白をスキップする
1549  rcStream.SkipSpace();
1550 
1551  // 1文字スキップする
1552  if ( !rcStream.SkipChar( L'=' ) ) {
1553  // 失敗!
1554  break;
1555  }
1556 
1557  // 空白をスキップする
1558  rcStream.SkipSpace();
1559 
1560  // JSONパス等号を設定する
1561  rcString.Push( L'=' );
1562  result = EJsonPathToken::Equal;
1563  }
1564  else {
1565  // 文字コードを調べる
1566  CJsonToken cJsonToken( nullptr );
1567  if ( L'\"' == ch ) {
1568  // JSON文字集合を取得する
1569  if ( !cJsonToken.InputJsonChars( rcStream ) ) {
1570  // 失敗!
1571  break;
1572  }
1573  // 1文字スキップする
1574  else if ( !rcStream.SkipChar( L'\"' ) ) {
1575  // 失敗!
1576  break;
1577  }
1578  }
1579  else {
1580  // ストリームポインタを設定する
1581  rcStream.SetStreamPoint( nPoint );
1582 
1583  // JSON文字集合を取得する
1584  if ( !cJsonToken.InputJsonChars( rcStream, L"/[= " ) ) {
1585  // 失敗!
1586  break;
1587  }
1588  }
1589 
1590  // JSONパス名前を設定する
1591  rcString.Push( cJsonToken );
1592  result = EJsonPathToken::Name;
1593  }
1594  } while ( false );
1595 
1596  // 実行結果を返す
1597  return result;
1598  }
1599 
1600  //-------------------------------------------------------------------------
1601  // JSON文字列二重引用符削除関数
1602  bool CJsonDocument::DeleteQuotes( CString& rcString ) noexcept {
1603  // 処理ブロック
1604  bool result = false;
1605  do {
1606  // 文字列長を取得する
1607  int nLen = rcString.GetCount();
1608  if ( 2 > nLen ) {
1609  // 失敗!
1610  break;
1611  }
1612  // 先頭の文字コードを調べる
1613  else if ( L'\"' != rcString[ 0 ] ) {
1614  // 失敗!
1615  break;
1616  }
1617  // 最後尾の文字コードを調べる
1618  else if ( L'\"' != rcString[ nLen - 1 ] ) {
1619  // 失敗!
1620  break;
1621  }
1622  // 最後尾の文字を削除する
1623  else if ( rcString.Remove( ( nLen - 1 ) ) ) {
1624  // 失敗!
1625  break;
1626  }
1627  // 先頭の文字を削除する
1628  else if ( rcString.Remove( 0 ) ) {
1629  // 失敗!
1630  break;
1631  }
1632 
1633  // 成功!
1634  result = true;
1635  } while ( false );
1636 
1637  // 実行結果を返す
1638  return result;
1639  }
1640 }
1641 
1642 #pragma managed( pop )
JSONペアクラス
Definition: CJsonPair.h:32
JSONトークンクラスヘッダファイル
JSONオブジェクトクラス
Definition: CJsonObject.h:31
virtual bool OutputJson(CStreamOut &rcStreamOut) noexcept
JSONクラス出力関数
Definition: CJson.h:232
virtual bool GetCurrentSetValue(CString &rcValue, bool bClassName=false, bool bQuotes=true) noexcept
カレント設定値文字列取得関数
virtual ~CJsonDocument() noexcept
デストラクタ
virtual CJsonValue * GetJsonValue() noexcept
Definition: CJson.h:166
static bool SetJsonSetValue(wchar_t const *pszValue, CJson *&rpcJson) noexcept
JSON設定値設定関数
virtual CJsonContainer * GetJsonContainer() noexcept
Definition: CJson.h:167
virtual CJsonContainer * GetJsonContainer() noexcept override
JSONクラスインスタンス取得関数
virtual CJsonPair * GetJsonPair() noexcept override
JSONクラスインスタンス取得関数
Definition: CJsonPair.h:95
CJsonDocument(CJson *pcJson=nullptr) noexcept
コンストラクタ
virtual CJsonObject * GetJsonObject() noexcept override
JSONクラスインスタンス取得関数
Definition: CJsonObject.h:93
virtual CJson * GetJsonParent() noexcept
親JSONクラス取得関数
Definition: CJson.h:106
virtual bool Remove() noexcept
削除関数
Definition: CArray.hpp:528
virtual bool DeleteCurrentJson() noexcept
カレントJSONクラス削除関数
virtual bool GetCurrentPath(CString &rcPath) noexcept
カレントパス取得関数
JSONコンテナクラスヘッダファイル
JSON配列クラスヘッダファイル
JSONライブラリ名前空間
Definition: CJson.h:24
配列クラス実装ヘッダファイル
virtual bool SetRootJson(CJson *pcJson) noexcept
ルートJSONクラス設定関数
JSON数値クラスヘッダファイル
JSON配列クラス
Definition: CJsonArray.h:31
virtual bool IsStreamEnd() const noexcept
ストリーム終端状態取得関数
Definition: CStream.cpp:85
JSONドキュメントクラスヘッダファイル
virtual CJson * GetJsonRoot() noexcept
ルートJSONクラス取得関数
Definition: CJson.cpp:61
virtual bool CreatePath(wchar_t const *pszPath) noexcept
JSONパス作成関数
static bool GetJsonSetValue(CString &rcValue, CJson *pcJson, bool bClassName=false, bool bQuotes=true) noexcept
JSON設定値文字列取得関数
virtual bool SetJsonElement(int nIndex, CJson *pcJson) noexcept
JSONエレメント設定関数
static EJsonPathToken InputPathToken(CStream &rcStream, CString &rcString, bool bEqual=false) noexcept
JSONパストークン入力関数
virtual bool Push(Type const &rElement) noexcept
プッシュ関数
Definition: CArray.hpp:686
virtual bool ExtendJsonElementCount(int nCount) noexcept
JSONエレメント数拡張関数
virtual CJsonPair * GetJsonPair(wchar_t const *pszName) noexcept
JSONペア取得関数
Definition: CJsonObject.cpp:41
virtual CJsonArray * GetJsonArray() noexcept override
JSONクラスインスタンス取得関数
Definition: CJsonArray.h:93
JSONコンテナクラス
virtual CJsonValue * GetJsonValue() noexcept override
Definition: CJsonPair.h:97
static bool DeleteQuotes(CString &rcString) noexcept
JSON文字列二重引用符削除関数
ストリームクラス
Definition: CStream.h:31
JSONオブジェクトクラス
JSONペアクラスヘッダファイル
virtual bool InputJsonChars(CStream &rcStream, wchar_t const *pszNgChars=nullptr) noexcept
JSON文字集合入力関数
Definition: CJsonToken.cpp:127
JSONクラス
Definition: CJson.h:44
ストリーム出力クラス
Definition: CStreamOut.h:30
virtual int Find(Type const &rElement) const noexcept
検索関数
Definition: CArray.hpp:637
virtual bool CompactDocument() noexcept
コンパクト化関数
virtual void SetJsonParent(CJson *pcParent) noexcept
親JSONクラス設定関数
Definition: CJson.h:117
JSONトークンクラス
Definition: CJsonToken.h:32
static bool GetJsonPathList(CString &rcPathList, CJson *pcJson) noexcept
JSONパスリスト取得関数
static bool GetJsonPath(CString &rcPath, CJson *pcJson) noexcept
JSONパス取得関数
JSONバリュークラスヘッダファイル
static CJson * FindJsonPath(wchar_t const *pszPath, CJson *pcJson) noexcept
JSONパス検索関数
virtual bool SetJsonValue(CJsonValue *pcJsonValue) noexcept
JSONバリュー設定関数
Definition: CJsonPair.cpp:228
virtual CJsonString * GetJsonString() noexcept
Definition: CJson.h:162
virtual void ClearDocument() noexcept
クリア関数
virtual bool IsJsonObject() noexcept
JSONクラス種別判定関数
Definition: CJson.h:141
virtual bool CompactJson() noexcept
JSONクラスコンパクト化関数
Definition: CJson.cpp:93
JSON固定値クラスヘッダファイル
virtual bool IsJsonPair() noexcept
Definition: CJson.h:146
virtual CJsonArray * GetJsonArray() noexcept
Definition: CJson.h:161
virtual bool OutputDocument(CStreamOut &rcStreamOut) noexcept
JSONドキュメント出力関数
文字列クラス
Definition: CString.h:31
virtual bool SetCurrentSetValue(wchar_t const *pszValue) noexcept
カレント設定値文字列設定関数
virtual bool IsJsonContainer() noexcept
Definition: CJson.h:148
virtual bool InputJsonInt(CStream &rcStream) noexcept
JSON整数部入力関数
Definition: CJsonToken.cpp:251
文字列ストリームクラス
Definition: CStringStream.h:31
static bool SetJsonSetValueByStream(CStream &rcStream, CJson *&rpcJson) noexcept
JSON設定値ストリーム設定関数
static CJsonValue * CreateInputJson(CStream &rcStream, CJson *pcParent) noexcept
JSONバリュー入力作成関数
Definition: CJsonValue.cpp:46
virtual CJsonPair * GetJsonPair() noexcept
Definition: CJson.h:165
文字列ストリームクラスヘッダ文字列
virtual bool SetCurrentPath(wchar_t const *pszPath) noexcept
カレントパス設定関数
static bool CreateJsonPath(wchar_t const *pszPath, CJson *&rpcJson) noexcept
JSONパス作成関数
EJsonPathToken
JSONパストークン種別列挙体
virtual bool InputDocument(CStream &rcStream) noexcept
JSONドキュメント入力関数
virtual bool IsJsonArray() noexcept
Definition: CJson.h:142
virtual CJsonToken * GetJsonToken() noexcept override
JSONクラスインスタンス取得関数
Definition: CJsonToken.h:95
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
JSONオブジェクトクラスヘッダファイル
JSON文字列クラスヘッダファイル
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ
virtual CJson * GetJsonElement(int nIndex) noexcept
JSONエレメント取得関数
ユーティリティライブラリヘッダファイル
virtual wchar_t const * GetBuffer() const noexcept
文字列バッファ取得関数
Definition: CString.h:159
JSON文字列クラス
Definition: CJsonString.h:30
virtual CJsonObject * GetJsonObject() noexcept
JSONクラスインスタンス取得関数
Definition: CJson.h:160
static CJsonPair * CreateInputJson(CStream &rcStream, CJson *pcParent) noexcept
JSONペア入力作成関数
Definition: CJsonPair.cpp:199
static bool DeleteJson(CJson *&rpcJson) noexcept
JSONクラス削除関数
virtual bool SetCurrentJson(CJson *pcJson) noexcept
カレントJSONクラス設定関数
virtual int GetCount() const noexcept
配列要素数取得関数
Definition: CArray.h:149