{"id":16636774,"url":"https://github.com/takamin/jsonexpr","last_synced_at":"2026-04-21T17:08:46.298Z","repository":{"id":31298398,"uuid":"34860556","full_name":"takamin/jsonexpr","owner":"takamin","description":"Json for C++","archived":false,"fork":false,"pushed_at":"2017-09-23T09:33:03.000Z","size":47,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-18T11:34:02.638Z","etag":null,"topics":["class-library","cplusplus","json"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/takamin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-04-30T15:01:43.000Z","updated_at":"2024-11-19T09:13:43.000Z","dependencies_parsed_at":"2022-09-09T10:22:51.789Z","dependency_job_id":null,"html_url":"https://github.com/takamin/jsonexpr","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takamin%2Fjsonexpr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takamin%2Fjsonexpr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takamin%2Fjsonexpr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takamin%2Fjsonexpr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/takamin","download_url":"https://codeload.github.com/takamin/jsonexpr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243141256,"owners_count":20242817,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["class-library","cplusplus","json"],"created_at":"2024-10-12T06:22:48.762Z","updated_at":"2026-04-21T17:08:41.265Z","avatar_url":"https://github.com/takamin.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"jsonexpr\n=======\n\nJSONをC++で自然に扱うために作ったライブラリです。\n\njson::var クラスのインスタンスが、JavaScript のデータ型(Number, boolean, string, Array, Object)に相当します。\n\n## データ型\n\n1. 数値 - double型の数値\n2. 文字列 - std::string型の文字列\n3. 配列 - json::var型の配列\n4. オブジェクト - 文字列からjson::var型へのディクショナリ\n\n## 初期化\n\njson::var のコンストラクタにJSON文字列を与えて初期化できます。\nプリミティブ型ではあとで説明していますが、代入するほうが直感的かも知れませんね。\n\n```\n//数値の初期化(内部表現は全てdouble)\njson::var real(\"-1.234e+5\");  //浮動小数点\njson::var dec(\"1234\");        //10進整数\njson::var hex(\"0x1234\");      //16進整数\njson::var oct(\"0644\");        //8進整数\n\n//文字列で初期化\njson::var str(\"'string'\");    //シングルクォート\n\n//配列の初期化\njson::var arr(\"[-1.234e+5,'string']\");\n\n//オブジェクトの初期化\njson::var obj(\"{'key':'value', foo: 'bar', arr:[1,2,3,4]}\");\n```\n\n## 配列操作\n\n1. length() - 要素数を得る\n2. push(値) - 要素の追加。値は数値、文字列、配列、オブジェクト\n3. remove(index) - 要素の削除。\n\n\n```\njson::var arr(\"[]\");//空の配列\narr.push(1.0);      //数値を追加\narr.push(\"string\"); //文字列を追加\nfor(int i = 0; i \u003c arr.length(); i++) {\n    cout \u003c\u003c arr[i];\n}\n```\n\n## オブジェクト操作\n\n1. exists(key) - キーの有無を調べる\n2. keys() - キーの配列を返す。\n3. remove(key) - キーの削除。\n\n新たなキーに値を関連付けるには、\\[\\]で直接代入します。\n※ 定数でないoperator`[](const std::string\u0026)`では、参照するだけでキーが作成されることに注意。\n\n```\njson::var obj(\"{}\");    //空のオブジェクト\nobj[\"A\"] = \"B\";         //文字列の値を追加\nobj[\"R\"] = arr;         //既にある配列のコピーを追加\njson::var keys = obj.keys();\nfor(int i = 0; i \u003c keys.length(); i++) {\n    cout \u003c\u003c \"#\" \u003c\u003c keys[i] \u003c\u003c \" =\u003e \" \u003c\u003c obj[keys[i]] \u003c\u003c endl;\n}\n```\n\n## 値の参照\n\n数値型は、doubleへのキャスト、文字列型は std::string\u0026へのキャストで値を参照します。\n\n配列要素とオブジェクトの値は\\[\\]を使用。配列要素は添え字が整数、オブジェクトは文字列型。\nネストしたオブジェクトは二次元配列のように\\[\\]をつないで参照します。\n\n```\ndouble v = (double)real;\nstd::string s = (const std::string\u0026)str;\nv = arr[3];             //配列要素の参照\nv = obj[\"arr\"][0];      //オブジェクト内の配列要素の参照\n```\n\n内部表現と矛盾する参照を行うと、例外が投入されます。\n\n\n## 値の代入\n\n```\ndata = 1.234;           //数値を代入\ndata = \"string\";        //文字列を代入\narr[3] = 1.234;         //配列要素の書き換え\nobj[\"key\"] = 1.234;     //オブジェクト要素の書き換え\nobj[\"new key\"] = arr;   //オブジェクトへ新たな項目を追加\n```\n\n## JSONデータのストリーム入出力\n\nC++の標準ストリーム入出力機能を実装しています。\n\n### std::istream からのJSONの読み込み\n\n```\njson::var dataobj;\nifstream is(\"input.json\");\nis \u003e\u003e dataobj;\n```\n\n### std::ostreamへのJSON出力\n\n```\njson::var dataobj;\nofstream is(\"output.json\");\nos \u003c\u003c dataobj;\n```\n\n## 制限事項\n\njavascriptの仕様に完全準拠しているわけではありません。\n\n* NaNを扱えません。\n* Functionを扱えません。\n* オブジェクトのキーは文字列だけです。\n* 数値は内部的にdoubleだけです。\n\n## 長いサンプル\n\n```\n    // json 文字列からの構築\n    json::var num(\"-1.2345e+3\");\n    json::var str(\"'this is string.'\");\n    json::var arr(\"[ \\\"key\\\", 'str', 'hex', 0xABCD, 0777 ]\");\n    json::var obj(\"{ foo : 'bar', 'boo':1.2345e-6, 'arr': [0,1,2,3]}\");\n\n    // 参照\n    double numval = num;\n    string strval = str;\n    cout \u003c\u003c numval \u003c\u003c endl;\n    cout \u003c\u003c strval \u003c\u003c endl;\n\n    numval = arr[3];\n    cout \u003c\u003c numval \u003c\u003c endl;\n\n    strval = (string)obj[\"foo\"];\n    cout \u003c\u003c strval \u003c\u003c endl;\n\n    strval = (string)obj[\"arr\"][2];\n    cout \u003c\u003c strval \u003c\u003c endl;\n\n    // 配列の扱い\n    cout \u003c\u003c \"arr.length() = \" \u003c\u003c arr.length() \u003c\u003c endl;\n    arr.push(9.876);\n    arr.push(\"string element\");\n    arr.push(obj);\n    arr.push(arr);\n    cout \u003c\u003c \"arr.length() = \" \u003c\u003c arr.length() \u003c\u003c endl;\n\n    //\n    // オブジェクトへ新たなキーを追加\n    //\n    cout \u003c\u003c \"obj.exists('new key') = \" \u003c\u003c (obj.exists(\"new key\")?\"true\":\"false\") \u003c\u003c endl;\n    obj[\"new key\"] = json::var(\"[0,1,2,3]\");\n    cout \u003c\u003c \"obj.exists('new key') = \" \u003c\u003c (obj.exists(\"new key\")?\"true\":\"false\") \u003c\u003c endl;\n\n    //\n    // std::ostreamへのJSONの書き出し\n    //\n    ostringstream os;\n    os \u003c\u003c obj;\n\n    //\n    // std::istreamからJSONを読み出し\n    //\n    istringstream is(\"{ foo : 'bar', 'boo':1.2345e-6, 'arr': [9,8,7,6] }\");\n    is \u003e\u003e obj;\n\n    //\n    // 別の値(別の型)に書き換え\n    //\n    num = 4.0;\n    cout \u003c\u003c num \u003c\u003c endl;\n\n    num = \"overwrite string\";\n    cout \u003c\u003c num \u003c\u003c endl;\n\n    num = obj;\n    cout \u003c\u003c num[\"boo\"] \u003c\u003c endl;\n\n    num[\"boo\"] = \"change by reference\";\n    cout \u003c\u003c num[\"boo\"] \u003c\u003c endl;\n\n    num[\"arr\"][1] = \"change by reference\";\n    cout \u003c\u003c num[\"arr\"][1] \u003c\u003c endl;\n```\n\nLICENSE\n-------\n\nこのソフトウェアは、MIT ライセンスにて、提供します。[LICENSE](LICENSE) を参照下さい。\n\nThis software is released under the MIT License, see [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakamin%2Fjsonexpr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftakamin%2Fjsonexpr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakamin%2Fjsonexpr/lists"}