KisaragiLibrary
 
読み取り中…
検索中…
一致する文字列を見つけられません
Kisaragi_Lib::JsonParser クラス

Json読み込みクラス [詳解]

#include <Json.hpp>

公開メンバ関数

 JsonParser (fs::path _jsonFile)
 自身が取り扱うJsonファイルを読み込みます
 
Json Parse ()
 読み込んだJsonファイルを変換し、Jsonクラスとして返します
 

非公開メンバ関数

void RemoveControlChars (std::string &str)
 ASCII code 32以下の制御文字を削除する
 
Json ParseObject ()
 
Json ParseArray ()
 
std::string ParseString ()
 
std::string ParseNotString ()
 
bool isNumber (const std::string &str)
 
Json ParseImpl ()
 
std::string Trim (const std::string &str)
 
void SpaceSkip ()
 
void CommaSkip ()
 

非公開変数類

std::string jsonFile
 
size_t pos
 

詳解

Json読み込みクラス

構築子と解体子

◆ JsonParser()

Kisaragi_Lib::JsonParser::JsonParser ( fs::path _jsonFile)
inline

自身が取り扱うJsonファイルを読み込みます

引数
_jsonFile変換するJsonファイルのパス
から
ver1.0.0 コメント追加
381 : pos(0)
382 {
383 //拡張子がなければ付ける
384 _jsonFile.replace_extension(".json");
385
386 if (!fs::exists(_jsonFile))
387 {
388 Debug::PrintAssertStatic(" JsonContainer.Load() : ファイルが存在しません");
389 return;
390 }
391
392 std::ifstream file(_jsonFile); // ファイルを開く
393
394 if (!file) {
395 Debug::PrintAssertStatic("ファイルを開けませんでした。");
396 return;
397 }
398
399 jsonFile = std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
400 file.close();
401
402 //制御文字を削除
404
405 }
static void PrintAssertStatic(const std::string _in)
エラー出力用コンソール出力(文字色しか変わらない)
Definition Debug.cpp:152
std::string jsonFile
Definition Json.hpp:372
size_t pos
Definition Json.hpp:373
void RemoveControlChars(std::string &str)
ASCII code 32以下の制御文字を削除する
Definition Json.hpp:432

関数詳解

◆ Parse()

Json Kisaragi_Lib::JsonParser::Parse ( )
inline

読み込んだJsonファイルを変換し、Jsonクラスとして返します

戻り値
変換されたJsonクラス
412 {
413 SpaceSkip();
414 if (jsonFile[pos] == '{')
415 {
416 return ParseObject();
417 }
418 else if (jsonFile[pos] == '[')
419 {
420 return ParseArray();
421 }
422
423 return Json{};
424 }
Json ParseArray()
Definition Json.hpp:479
Json ParseObject()
Definition Json.hpp:438
void SpaceSkip()
Definition Json.hpp:603

参照元 Kisaragi_Lib::SerializableObject::FormJson().

◆ RemoveControlChars()

void Kisaragi_Lib::JsonParser::RemoveControlChars ( std::string & str)
inlineprivate

ASCII code 32以下の制御文字を削除する

引数
str
433 {
434 str.erase(std::remove_if(str.begin(), str.end(),
435 [](char c) { return (c < 32); }), str.end());
436 }

参照元 JsonParser().

◆ ParseObject()

Json Kisaragi_Lib::JsonParser::ParseObject ( )
inlineprivate
439 {
440 pos++; // '{' をスキップ
441 SpaceSkip();
442
443 Json json = Json();
444
445 while (jsonFile[pos] != '}')
446 {
447 std::string key;
448
449 key = ParseString();
450 SpaceSkip();
451
452 if (jsonFile[pos] != ':')
453 {
454 return json;
455 //throw std::runtime_error("Expected ':'");
456 }
457
458 pos++; //:をスキップ
459 SpaceSkip();
460
461 json[key] = ParseImpl();
462
463 SpaceSkip();
464
465 CommaSkip();
466
467 SpaceSkip();
468
469 }
470
471 if (jsonFile[pos] == '}')
472 {
473 pos++;
474 }
475
476 return json;
477 }
void CommaSkip()
Definition Json.hpp:611
std::string ParseString()
Definition Json.hpp:509
Json ParseImpl()
Definition Json.hpp:544

参照元 Parse(), ParseImpl().

◆ ParseArray()

Json Kisaragi_Lib::JsonParser::ParseArray ( )
inlineprivate
480 {
481 pos++; // '{' をスキップ
482
483 Json json = Json{};
484
485 int i = 0;
486 while (jsonFile[pos] != ']')
487 {
488 SpaceSkip();
489
490 json[i] = ParseImpl();
491
492 SpaceSkip();
493
494 CommaSkip();
495
496 SpaceSkip();
497
498 i++;
499 }
500
501 if (jsonFile[pos] == ']')
502 {
503 pos++;
504 }
505
506 return json;
507 }

参照元 Parse(), ParseImpl().

◆ ParseString()

std::string Kisaragi_Lib::JsonParser::ParseString ( )
inlineprivate
510 {
511 std::string result;
512 pos++; // '"' をスキップ
513
514 while (pos < jsonFile.size() && jsonFile[pos] != '"') {
515 result += jsonFile[pos++];
516 }
517
518 pos++; // '"' をスキップ
519 return result;
520 }

参照元 ParseImpl(), ParseObject().

◆ ParseNotString()

std::string Kisaragi_Lib::JsonParser::ParseNotString ( )
inlineprivate
523 {
524 std::string result;
525
526 while (pos < jsonFile.size() && jsonFile[pos] != ',' && jsonFile[pos] != ']' && jsonFile[pos] != '}') {
527 result += jsonFile[pos++];
528 }
529
530 return Trim(result);
531 }
std::string Trim(const std::string &str)
Definition Json.hpp:593

参照元 ParseImpl().

◆ isNumber()

bool Kisaragi_Lib::JsonParser::isNumber ( const std::string & str)
inlineprivate
534 {
535 try {
536 std::stod(str); // ストリングを数値に変換できるか試す
537 return true;
538 }
539 catch (...) {
540 return false;
541 }
542 }

参照元 ParseImpl().

◆ ParseImpl()

Json Kisaragi_Lib::JsonParser::ParseImpl ( )
inlineprivate
545 {
546 SpaceSkip();
547 if (jsonFile[pos] == '{')
548 {
549 return ParseObject();
550 }
551 else if (jsonFile[pos] == '[')
552 {
553 return ParseArray();
554 }
555 else if (jsonFile[pos] == '\"')
556 {
557 return Json(ParseString());
558 }
559 else if (jsonFile[pos] != ',')
560 {
561 std::string str = ParseNotString();
562
563 if (str == "true")
564 {
565 return Json(true);
566 }
567 else if (str == "false")
568 {
569 return Json(false);
570 }
571 else if (str.find(".") != std::string::npos || !str.empty() && str.back() == 'f')
572 {
573 if (!str.empty() && str.back() == 'f') {
574 str.pop_back(); // 末尾の 'f' を削除
575 }
576
577 return Json(std::stof(str));
578 }
579 else if (isNumber(str))
580 {
581 return Json(std::stoi(str));
582 }
583
584 return Json{};
585 }
586 else
587 {
588 //何も入力されていないためnull
589 return Json{};
590 }
591 }
bool isNumber(const std::string &str)
Definition Json.hpp:533
std::string ParseNotString()
Definition Json.hpp:522

参照元 ParseArray(), ParseObject().

◆ Trim()

std::string Kisaragi_Lib::JsonParser::Trim ( const std::string & str)
inlineprivate
594 {
595 size_t first = str.find_first_not_of(" \t\n\r");
596 if (first == std::string::npos)
597 return "";
598
599 size_t last = str.find_last_not_of(" \t\n\r");
600 return str.substr(first, (last - first + 1));
601 }

参照元 ParseNotString().

◆ SpaceSkip()

void Kisaragi_Lib::JsonParser::SpaceSkip ( )
inlineprivate
604 {
605 while (pos < jsonFile.size() && std::isspace(jsonFile[pos]))
606 {
607 pos++;
608 }
609 }

参照元 Parse(), ParseArray(), ParseImpl(), ParseObject().

◆ CommaSkip()

void Kisaragi_Lib::JsonParser::CommaSkip ( )
inlineprivate
612 {
613 if (pos < jsonFile.size() && jsonFile[pos] == ',')
614 {
615 pos++; //, をスキップ
616 }
617 }

参照元 ParseArray(), ParseObject().

メンバ詳解

◆ jsonFile

std::string Kisaragi_Lib::JsonParser::jsonFile
private

◆ pos

size_t Kisaragi_Lib::JsonParser::pos
private

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