Solution46
LibJson::CJsonDocument クラス

JSONドキュメントクラス [詳解]

#include "CJsonDocument.h"

LibJson::CJsonDocument の継承関係図
Inheritance graph
LibJson::CJsonDocument 連携図
Collaboration graph

公開メンバ関数

 CJsonDocument (CJson *pcJson=nullptr) noexcept
 コンストラクタ [詳解]
 
virtual ~CJsonDocument () noexcept
 デストラクタ [詳解]
 
virtual bool IsEmpty () noexcept
 空状態取得関数 [詳解]
 
virtual CJsonGetRootJson () noexcept
 ルートJSONクラス取得関数 [詳解]
 
virtual bool SetRootJson (CJson *pcJson) noexcept
 ルートJSONクラス設定関数 [詳解]
 
virtual CJsonGetCurrentJson () noexcept
 カレントJSONクラス取得関数 [詳解]
 
virtual bool SetCurrentJson (CJson *pcJson) noexcept
 カレントJSONクラス設定関数 [詳解]
 
virtual void ClearDocument () noexcept
 クリア関数 [詳解]
 
virtual bool CompactDocument () noexcept
 コンパクト化関数 [詳解]
 
virtual bool InputDocument (CStream &rcStream) noexcept
 JSONドキュメント入力関数 [詳解]
 
virtual bool OutputDocument (CStreamOut &rcStreamOut) noexcept
 JSONドキュメント出力関数 [詳解]
 
virtual bool DeleteCurrentJson () noexcept
 カレントJSONクラス削除関数 [詳解]
 
virtual bool GetCurrentPath (CString &rcPath) noexcept
 カレントパス取得関数 [詳解]
 
virtual bool SetCurrentPath (wchar_t const *pszPath) noexcept
 カレントパス設定関数 [詳解]
 
virtual bool GetCurrentSetValue (CString &rcValue, bool bClassName=false, bool bQuotes=true) noexcept
 カレント設定値文字列取得関数 [詳解]
 
virtual bool SetCurrentSetValue (wchar_t const *pszValue) noexcept
 カレント設定値文字列設定関数 [詳解]
 
virtual bool CreatePath (wchar_t const *pszPath) noexcept
 JSONパス作成関数 [詳解]
 

静的公開メンバ関数

static bool GetJsonPath (CString &rcPath, CJson *pcJson) noexcept
 JSONパス取得関数 [詳解]
 
static CJsonFindJsonPath (wchar_t const *pszPath, CJson *pcJson) noexcept
 JSONパス検索関数 [詳解]
 
static bool GetJsonSetValue (CString &rcValue, CJson *pcJson, bool bClassName=false, bool bQuotes=true) noexcept
 JSON設定値文字列取得関数 [詳解]
 
static bool SetJsonSetValue (wchar_t const *pszValue, CJson *&rpcJson) noexcept
 JSON設定値設定関数 [詳解]
 
static bool SetJsonSetValueByStream (CStream &rcStream, CJson *&rpcJson) noexcept
 JSON設定値ストリーム設定関数 [詳解]
 
static bool DeleteJson (CJson *&rpcJson) noexcept
 JSONクラス削除関数 [詳解]
 
static bool CreateJsonPath (wchar_t const *pszPath, CJson *&rpcJson) noexcept
 JSONパス作成関数 [詳解]
 
static bool GetJsonPathList (CString &rcPathList, CJson *pcJson) noexcept
 JSONパスリスト取得関数 [詳解]
 

限定公開型

enum  EJsonPathToken {
  EJsonPathToken::Invalid, EJsonPathToken::Separator, EJsonPathToken::Dot, EJsonPathToken::DotDot,
  EJsonPathToken::Name, EJsonPathToken::Index, EJsonPathToken::Equal, EJsonPathToken::Size
}
 JSONパストークン種別列挙体 [詳解]
 

静的限定公開メンバ関数

static EJsonPathToken InputPathToken (CStream &rcStream, CString &rcString, bool bEqual=false) noexcept
 JSONパストークン入力関数 [詳解]
 
static bool DeleteQuotes (CString &rcString) noexcept
 JSON文字列二重引用符削除関数 [詳解]
 

限定公開変数類

CJsonm_pcJsonRoot
 ルートJSONクラスポインタ [詳解]
 
CJsonm_pcJsonCurrent
 カレントJSONクラスポインタ [詳解]
 

非公開メンバ関数

 CJsonDocument (CJsonDocument const &)=delete
 
CJsonDocumentoperator= (CJsonDocument const &)=delete
 

詳解

JSONドキュメントクラス

JSONドキュメントクラスです。

注意
なし

CJsonDocument.h32 行目に定義があります。

列挙型メンバ詳解

JSONパストークン種別列挙体

JSONパストークン種別列挙体です。

注意
なし
列挙値
Invalid 

無効値

Separator 

セパレータ

Dot 

ドット

DotDot 

二重ドット

Name 

名前

Index 

インデックス

Equal 

等号

Size 

列挙体サイズ

CJsonDocument.h379 行目に定義があります。

379  {
380  Invalid, ///< 無効値
381  Separator, ///< セパレータ
382  Dot, ///< ドット
383  DotDot, ///< 二重ドット
384  Name, ///< 名前
385  Index, ///< インデックス
386  Equal, ///< 等号
387  Size ///< 列挙体サイズ
388  };

構築子と解体子

LibJson::CJsonDocument::CJsonDocument ( CJson pcJson = nullptr)
explicitnoexcept

コンストラクタ

コンストラクタです。

引数
[in]pcJsonJSONクラスポインタ
戻り値
なし
注意
なし

CJsonDocument.cpp43 行目に定義があります。

45  : m_pcJsonRoot( pcJson )
47  {}
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ
LibJson::CJsonDocument::~CJsonDocument ( )
virtualnoexcept

デストラクタ

デストラクタです。

引数
なし
戻り値
なし
注意
なし

CJsonDocument.cpp51 行目に定義があります。

参照先 ClearDocument().

51  {
52  // クリアする
53  ClearDocument();
54  }
virtual void ClearDocument() noexcept
クリア関数

呼び出し関係図:

LibJson::CJsonDocument::CJsonDocument ( CJsonDocument const &  )
privatedelete

関数詳解

virtual bool LibJson::CJsonDocument::IsEmpty ( )
inlinevirtualnoexcept

空状態取得関数

空状態取得関数です。

引数
なし
戻り値
実行結果
  • true 空である
  • false 空でない
注意
なし

CJsonDocument.h72 行目に定義があります。

72 { return ( nullptr == m_pcJsonRoot ); }
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
virtual CJson* LibJson::CJsonDocument::GetRootJson ( )
inlinevirtualnoexcept

ルートJSONクラス取得関数

ルートJSONクラス取得関数です。

引数
なし
戻り値
JSONクラスポインタ
注意
なし

CJsonDocument.h86 行目に定義があります。

86 { return m_pcJsonRoot; }
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
bool LibJson::CJsonDocument::SetRootJson ( CJson pcJson)
virtualnoexcept

ルートJSONクラス設定関数

ルートJSONクラス設定関数です。

引数
[in]pcJsonJSONクラスポインタ
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp60 行目に定義があります。

参照先 ClearDocument(), m_pcJsonCurrent, m_pcJsonRoot.

参照元 SetCurrentJson().

60  {
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  }
virtual void ClearDocument() noexcept
クリア関数
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

呼び出し関係図:

被呼び出し関係図:

virtual CJson* LibJson::CJsonDocument::GetCurrentJson ( )
inlinevirtualnoexcept

カレントJSONクラス取得関数

カレントJSONクラス取得関数です。

引数
なし
戻り値
JSONクラスポインタ
注意
なし

CJsonDocument.h110 行目に定義があります。

110 { return m_pcJsonCurrent; }
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ
bool LibJson::CJsonDocument::SetCurrentJson ( CJson pcJson)
virtualnoexcept

カレントJSONクラス設定関数

カレントJSONクラス設定関数です。

引数
[in]pcJsonJSONクラスポインタ
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp91 行目に定義があります。

参照先 LibJson::CJson::GetJsonRoot(), m_pcJsonCurrent, m_pcJsonRoot, SetRootJson().

91  {
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  }
virtual bool SetRootJson(CJson *pcJson) noexcept
ルートJSONクラス設定関数
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

呼び出し関係図:

void LibJson::CJsonDocument::ClearDocument ( )
virtualnoexcept

クリア関数

クリア関数です。

引数
なし
戻り値
なし
注意
なし

CJsonDocument.cpp131 行目に定義があります。

参照先 m_pcJsonCurrent, m_pcJsonRoot.

参照元 CreatePath(), DeleteCurrentJson(), InputDocument(), SetCurrentSetValue(), SetRootJson(), ~CJsonDocument().

131  {
132  // ルートJSONクラスを削除する
133  delete m_pcJsonRoot;
134  m_pcJsonRoot = nullptr;
135  m_pcJsonCurrent = nullptr;
136  }
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

被呼び出し関係図:

bool LibJson::CJsonDocument::CompactDocument ( )
virtualnoexcept

コンパクト化関数

コンパクト化関数です。

引数
なし
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp140 行目に定義があります。

参照先 LibJson::CJson::CompactJson(), m_pcJsonRoot.

140  {
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  }
virtual bool CompactJson() noexcept
JSONクラスコンパクト化関数
Definition: CJson.cpp:93
CJson * m_pcJsonRoot
ルートJSONクラスポインタ

呼び出し関係図:

bool LibJson::CJsonDocument::InputDocument ( CStream rcStream)
virtualnoexcept

JSONドキュメント入力関数

JSONドキュメント入力関数です。

引数
[in]rcStream入力ストリーム参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp163 行目に定義があります。

参照先 ClearDocument(), LibJson::CJsonValue::CreateInputJson(), LibJson::CJsonPair::CreateInputJson(), m_pcJsonCurrent, m_pcJsonRoot.

参照元 LibJson::CJsonConfig::Load().

163  {
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  }
virtual void ClearDocument() noexcept
クリア関数
static CJsonValue * CreateInputJson(CStream &rcStream, CJson *pcParent) noexcept
JSONバリュー入力作成関数
Definition: CJsonValue.cpp:46
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ
static CJsonPair * CreateInputJson(CStream &rcStream, CJson *pcParent) noexcept
JSONペア入力作成関数
Definition: CJsonPair.cpp:199

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::OutputDocument ( CStreamOut rcStreamOut)
virtualnoexcept

JSONドキュメント出力関数

JSONドキュメント出力関数です。

引数
[in]rcStreamOut出力ストリーム参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp206 行目に定義があります。

参照先 m_pcJsonRoot, LibJson::CJson::OutputJson().

参照元 LibJson::CJsonConfig::Save().

206  {
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  }
virtual bool OutputJson(CStreamOut &rcStreamOut) noexcept
JSONクラス出力関数
Definition: CJson.h:232
CJson * m_pcJsonRoot
ルートJSONクラスポインタ

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::DeleteCurrentJson ( )
virtualnoexcept

カレントJSONクラス削除関数

カレントJSONクラス削除関数です。

引数
なし
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp234 行目に定義があります。

参照先 ClearDocument(), DeleteJson(), m_pcJsonCurrent, m_pcJsonRoot.

参照元 LibJson::CJsonConfigAuto::~CJsonConfigAuto().

234  {
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  }
virtual void ClearDocument() noexcept
クリア関数
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ
static bool DeleteJson(CJson *&rpcJson) noexcept
JSONクラス削除関数

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::GetCurrentPath ( CString rcPath)
virtualnoexcept

カレントパス取得関数

カレントパス取得関数です。

引数
[out]rcPath文字列クラス参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp259 行目に定義があります。

参照先 GetJsonPath(), m_pcJsonCurrent.

参照元 CreatePath().

259  {
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  }
static bool GetJsonPath(CString &rcPath, CJson *pcJson) noexcept
JSONパス取得関数
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::SetCurrentPath ( wchar_t const *  pszPath)
virtualnoexcept

カレントパス設定関数

カレントパス設定関数です。

引数
[in]pszPathJSONパス文字列
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp273 行目に定義があります。

参照先 FindJsonPath(), m_pcJsonCurrent.

参照元 LibJson::CJsonConfigAuto::~CJsonConfigAuto().

273  {
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  }
static CJson * FindJsonPath(wchar_t const *pszPath, CJson *pcJson) noexcept
JSONパス検索関数
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::GetCurrentSetValue ( CString rcValue,
bool  bClassName = false,
bool  bQuotes = true 
)
virtualnoexcept

カレント設定値文字列取得関数

カレント設定値文字列取得関数です。

引数
[out]rcValue設定値文字列参照
[in]bClassNameクラス名取得フラグ
[in]bQuotesJSON文字列二重引用符なしフラグ
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp297 行目に定義があります。

参照先 GetJsonSetValue(), m_pcJsonCurrent.

参照元 LibJson::CJsonConfigAuto::~CJsonConfigAuto().

297  {
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  }
static bool GetJsonSetValue(CString &rcValue, CJson *pcJson, bool bClassName=false, bool bQuotes=true) noexcept
JSON設定値文字列取得関数
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::SetCurrentSetValue ( wchar_t const *  pszValue)
virtualnoexcept

カレント設定値文字列設定関数

カレント設定値文字列設定関数です。

引数
[in]pszValue設定値文字列
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp311 行目に定義があります。

参照先 ClearDocument(), m_pcJsonCurrent, m_pcJsonRoot, SetJsonSetValue().

311  {
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  }
static bool SetJsonSetValue(wchar_t const *pszValue, CJson *&rpcJson) noexcept
JSON設定値設定関数
virtual void ClearDocument() noexcept
クリア関数
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

呼び出し関係図:

bool LibJson::CJsonDocument::CreatePath ( wchar_t const *  pszPath)
virtualnoexcept

JSONパス作成関数

JSONパス作成関数です。

引数
[in]pszPathJSONパス文字列
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp343 行目に定義があります。

参照先 ClearDocument(), CreateJsonPath(), FindJsonPath(), GetCurrentPath(), LibJson::CJson::GetJsonRoot(), m_pcJsonCurrent, m_pcJsonRoot.

参照元 LibJson::CJsonConfig::Set().

343  {
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  }
virtual bool GetCurrentPath(CString &rcPath) noexcept
カレントパス取得関数
virtual CJson * GetJsonRoot() noexcept
ルートJSONクラス取得関数
Definition: CJson.cpp:61
static CJson * FindJsonPath(wchar_t const *pszPath, CJson *pcJson) noexcept
JSONパス検索関数
virtual void ClearDocument() noexcept
クリア関数
static bool CreateJsonPath(wchar_t const *pszPath, CJson *&rpcJson) noexcept
JSONパス作成関数
CJson * m_pcJsonRoot
ルートJSONクラスポインタ
CJson * m_pcJsonCurrent
カレントJSONクラスポインタ

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::GetJsonPath ( CString rcPath,
CJson pcJson 
)
staticnoexcept

JSONパス取得関数

JSONパス取得関数です。

引数
[out]rcPathJSONパス文字列参照
[in]pcJsonJSONクラスポインタ
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp390 行目に定義があります。

参照先 LibCommon::CArray< Type >::GetCount(), LibJson::CJson::GetJsonArray(), LibJson::CJson::GetJsonParent(), LibJson::CJson::GetJsonString(), LibJson::CJson::IsJsonArray(), LibJson::CJson::IsJsonPair().

参照元 GetCurrentPath(), GetJsonPathList().

390  {
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  }

呼び出し関係図:

被呼び出し関係図:

CJson * LibJson::CJsonDocument::FindJsonPath ( wchar_t const *  pszPath,
CJson pcJson 
)
staticnoexcept

JSONパス検索関数

JSONパス検索関数です。

引数
[in]pszPathJSONパス文字列
[in]pcJsonJSONクラスポインタ
戻り値
JSOBクラスポインタ
注意
なし

CJsonDocument.cpp519 行目に定義があります。

参照先 Dot, DotDot, LibJson::CJsonArray::GetJsonArray(), LibJson::CJsonContainer::GetJsonElement(), LibJson::CJsonObject::GetJsonObject(), LibJson::CJsonPair::GetJsonPair(), LibJson::CJsonObject::GetJsonPair(), LibJson::CJsonPair::GetJsonValue(), Index, InputPathToken(), Invalid, LibCommon::CStream::IsStreamEnd(), Name, Separator.

参照元 CreatePath(), LibJson::CJsonConfig::Delete(), LibJson::CJsonConfig::Get(), SetCurrentPath().

519  {
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  }
static EJsonPathToken InputPathToken(CStream &rcStream, CString &rcString, bool bEqual=false) noexcept
JSONパストークン入力関数
EJsonPathToken
JSONパストークン種別列挙体

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::GetJsonSetValue ( CString rcValue,
CJson pcJson,
bool  bClassName = false,
bool  bQuotes = true 
)
staticnoexcept

JSON設定値文字列取得関数

JSON設定値文字列取得関数です。

引数
[out]rcValueJSON設定値文字列参照
[in]pcJsonJSONクラスポインタ
[in]bClassNameJSONクラス名取得フラグ
[in]bQuotesJSON文字列二重引用符なしフラグ
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp631 行目に定義があります。

参照先 LibCommon::CArray< Type >::GetCount(), LibJson::CJsonContainer::GetJsonContainer(), LibJson::CJsonToken::GetJsonToken(), LibJson::CJson::JsonArray, LibJson::CJson::JsonFixed, LibJson::CJson::JsonNumber, LibJson::CJson::JsonObject, LibJson::CJson::JsonPair, LibJson::CJson::JsonString.

参照元 LibJson::CJsonConfig::Get(), GetCurrentSetValue(), GetJsonPathList().

631  {
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  }
static bool GetJsonSetValue(CString &rcValue, CJson *pcJson, bool bClassName=false, bool bQuotes=true) noexcept
JSON設定値文字列取得関数
JSONオブジェクトクラス

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::SetJsonSetValue ( wchar_t const *  pszValue,
CJson *&  rpcJson 
)
staticnoexcept

JSON設定値設定関数

JSON設定値設定関数です。

引数
[in]pszValueJSON設定値文字列
[in,out]rpcJsonJSONクラスポインタ参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp771 行目に定義があります。

参照先 SetJsonSetValueByStream().

参照元 SetCurrentSetValue().

771  {
772  // 文字列ストリームでJSON設定値を設定する
773  CStringStream cStream( pszValue );
774  return SetJsonSetValueByStream( cStream, rpcJson );
775  }
static bool SetJsonSetValueByStream(CStream &rcStream, CJson *&rpcJson) noexcept
JSON設定値ストリーム設定関数

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::SetJsonSetValueByStream ( CStream rcStream,
CJson *&  rpcJson 
)
staticnoexcept

JSON設定値ストリーム設定関数

JSON設定値ストリーム設定関数です。

引数
[in]rcStreamJSON設定値ストリーム参照
[in,out]rpcJsonJSONクラスポインタ参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp779 行目に定義があります。

参照先 LibJson::CJsonValue::CreateInputJson(), LibJson::CJsonPair::CreateInputJson(), LibCommon::CArray< Type >::Find(), LibJson::CJson::GetJsonContainer(), LibJson::CJsonContainer::GetJsonElement(), LibJson::CJson::GetJsonPair(), LibJson::CJson::GetJsonParent(), LibJson::CJson::GetJsonValue(), LibJson::CJson::IsJsonArray(), LibJson::CJson::IsJsonContainer(), LibJson::CJson::IsJsonObject(), LibJson::CJson::IsJsonPair(), LibJson::CJsonContainer::SetJsonElement(), LibJson::CJsonPair::SetJsonValue().

参照元 CreateJsonPath(), SetJsonSetValue().

779  {
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  }
static CJsonValue * CreateInputJson(CStream &rcStream, CJson *pcParent) noexcept
JSONバリュー入力作成関数
Definition: CJsonValue.cpp:46
static CJsonPair * CreateInputJson(CStream &rcStream, CJson *pcParent) noexcept
JSONペア入力作成関数
Definition: CJsonPair.cpp:199

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::DeleteJson ( CJson *&  rpcJson)
staticnoexcept

JSONクラス削除関数

JSONクラス削除関数です。

引数
[in,out]rpcJsonJSONクラスポインタ参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp925 行目に定義があります。

参照先 LibCommon::CArray< Type >::Find(), LibCommon::CArray< Type >::GetCount(), LibJson::CJson::GetJsonContainer(), LibJson::CJson::GetJsonParent(), LibJson::CJson::IsJsonContainer(), LibJson::CJson::IsJsonPair(), LibCommon::CArray< Type >::Remove().

参照元 LibJson::CJsonConfig::Delete(), DeleteCurrentJson().

925  {
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  }
static bool DeleteJson(CJson *&rpcJson) noexcept
JSONクラス削除関数

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::CreateJsonPath ( wchar_t const *  pszPath,
CJson *&  rpcJson 
)
staticnoexcept

JSONパス作成関数

JSONパス作成関数です。

引数
[in]pszPathJSONパス文字列
[in,out]rpcJsonJSONクラスポインタ参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp1013 行目に定義があります。

参照先 Dot, DotDot, Equal, LibJson::CJsonContainer::ExtendJsonElementCount(), LibCommon::CArray< Type >::Find(), LibCommon::CArray< Type >::GetCount(), LibJson::CJsonArray::GetJsonArray(), LibJson::CJson::GetJsonArray(), LibJson::CJsonObject::GetJsonObject(), LibJson::CJson::GetJsonObject(), LibJson::CJsonPair::GetJsonPair(), LibJson::CJsonObject::GetJsonPair(), LibJson::CJson::GetJsonPair(), LibJson::CJson::GetJsonParent(), LibJson::CJsonPair::GetJsonValue(), Index, InputPathToken(), Invalid, LibJson::CJson::IsJsonArray(), LibJson::CJson::IsJsonObject(), LibJson::CJson::IsJsonPair(), LibCommon::CStream::IsStreamEnd(), Name, LibCommon::CArray< Type >::Push(), Separator, LibJson::CJson::SetJsonParent(), SetJsonSetValueByStream(), LibJson::CJsonPair::SetJsonValue() (計28項目).

参照元 CreatePath().

1013  {
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  }
static EJsonPathToken InputPathToken(CStream &rcStream, CString &rcString, bool bEqual=false) noexcept
JSONパストークン入力関数
static bool SetJsonSetValueByStream(CStream &rcStream, CJson *&rpcJson) noexcept
JSON設定値ストリーム設定関数
EJsonPathToken
JSONパストークン種別列挙体

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::GetJsonPathList ( CString rcPathList,
CJson pcJson 
)
staticnoexcept

JSONパスリスト取得関数

JSONパスリスト取得関数です。

引数
[out]rcPathList文字列クラス参照
[in]pcJsonJSONクラスポインタ
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp1352 行目に定義があります。

参照先 LibCommon::CString::GetBuffer(), LibCommon::CArray< Type >::GetCount(), LibJson::CJsonContainer::GetJsonContainer(), GetJsonPath(), GetJsonSetValue().

1352  {
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  }
static bool GetJsonSetValue(CString &rcValue, CJson *pcJson, bool bClassName=false, bool bQuotes=true) noexcept
JSON設定値文字列取得関数
static bool GetJsonPathList(CString &rcPathList, CJson *pcJson) noexcept
JSONパスリスト取得関数
static bool GetJsonPath(CString &rcPath, CJson *pcJson) noexcept
JSONパス取得関数

呼び出し関係図:

CJsonDocument::EJsonPathToken LibJson::CJsonDocument::InputPathToken ( CStream rcStream,
CString rcString,
bool  bEqual = false 
)
staticprotectednoexcept

JSONパストークン入力関数

JSONパストークン入力関数です。

引数
[in]rcStream入力ストリーム参照
[out]rcToken文字列クラス参照
[in]bEqual等号許可フラグ
戻り値
JSONパストークン種別
注意
なし

CJsonDocument.cpp1470 行目に定義があります。

参照先 Dot, DotDot, Equal, Index, LibJson::CJsonToken::InputJsonChars(), LibJson::CJsonToken::InputJsonInt(), Invalid, Name, Separator.

参照元 CreateJsonPath(), FindJsonPath().

1470  {
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  }
EJsonPathToken
JSONパストークン種別列挙体

呼び出し関係図:

被呼び出し関係図:

bool LibJson::CJsonDocument::DeleteQuotes ( CString rcString)
staticprotectednoexcept

JSON文字列二重引用符削除関数

JSON文字列二重引用符削除関数です。

引数
[out]rcString文字列参照
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CJsonDocument.cpp1602 行目に定義があります。

1602  {
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  }
CJsonDocument& LibJson::CJsonDocument::operator= ( CJsonDocument const &  )
privatedelete

メンバ詳解

CJson* LibJson::CJsonDocument::m_pcJsonRoot
protected
CJson* LibJson::CJsonDocument::m_pcJsonCurrent
protected

このクラス詳解は次のファイルから抽出されました: