C++ json操作するなら rapidjson

picojsonはシンプルでいいけど、大きいjsonだと重かったりデメリットが多くなる。

どうせ慣れるならrapidjson がよいようです。
github.com

ChatGPTの回答

✅ 概要

項目 rapidjson picojson
性能(速度) 🚀 非常に高速(名前通り) 🐢 遅い(特にパース・シリアライズ)
構造 DOM / SAX 両対応 DOMのみ
順序保持 ✅ **保持される**(配列・オブジェクト) ❌ `std::map`使用のため**ソートされる**
ヘッダーのみ ✅ ヘッダーオンリー ✅ ヘッダーオンリー
依存なし ✅ STLのみ ✅ STLのみ
ドキュメント 豊富・サンプル多数 最小限(READMEレベル)
C++11 必須か ❌(C++03でも動く) ✅ C++11必須
Unicode対応 ◯(UTF-8前提、WCHAR非対応) ◯(UTF-8前提)
設計思想 パフォーマンス重視 最小限・シンプル実装
可読性 ◯(冗長な分、明示的) ◎(シンプルな構文)

✅ rapidjson のメリット・デメリット

🔷 メリット

・圧倒的に高速(名前の通り本気で早い)
・ 順序保持(`Object` のキー順や `Array` の順序が維持される)
・ SAXパーサ付き(巨大JSON処理に便利)
・ 豊富なサンプルと公式ドキュメント
・ `Allocator` で柔軟なメモリ制御ができる
・ JSON整形出力(`PrettyWriter`)

🔶 デメリット

・APIが冗長(`AddMember()` や `StringRef()` など煩雑)
・テンプレート・アロケータ管理がやや面倒
・Value["key"]` で値がないとクラッシュする(要 `HasMember()`)

✅ picojson のメリット・デメリット

🔷 メリット

・極限まで軽量でシンプル**(単一ヘッダ)
・ APIが直感的(`.get()`, `.serialize()`)
・ コンパイル通ればすぐ使える
・ ちょっとしたツールやプロトタイプに最適
・ `std::map`, `std::vector` ベースで STLライク

🔶 デメリット

・遅い(特に文字列構築とパース)
・ オブジェクトが `std::map` なので **勝手にソートされる**
・JSON構造が大きいとパフォーマンスが激落ち
・ 日本語リソース・ドキュメントほぼなし
・ 厳密な型チェックがない(型違いで落ちやすい)

✅ どっちを選ぶべき?

用途 おすすめ
GUIアプリ(MFCなど)で順序付きJSON処理したい ✅ rapidjson
順序関係なく小さな設定ファイルを読みたい ✅ picojson
速度・大規模データが重要 ✅ rapidjson 一択
ヘッダー1枚で最小構成がいい ✅ picojson でも可
JSONを書き換えず読むだけ picojsonでもOK(順序気にしないなら)

✅ 実際の現場での使い分け例

シーン 使用例 推奨ライブラリ
設定ファイルの読み書き `.json`で保存 picojson(軽量)
ブラウザ通信結果(REST API) JSON構造が複雑 rapidjson(順序維持)
巨大なログ分析ツール 数百MBのJSON処理 rapidjson(SAX)
MFCアプリの設定UI 順序重視 rapidjson(安全)
スクリプト風の実験コード 簡単に書きたい picojson(気軽)

✅ 結論

📌 順序が大事・本番アプリで使うなら `rapidjson`
📌 シンプルな用途・ツール系なら `picojson`