質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

8402閲覧

c++でrapidJSONを使ったデータのはきだし方。

abebemukkuru

総合スコア7

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/03/06 13:27

cocos2d-x v3.13.1を使用しています。windowsです。
今回、cocosの中にあるrapidJSONを使用してデータを出力しようとしたのですがうまくいきませんでした。

エラーが出るのは、
rapidjson::Value& hello = d["serihu_test"];の部分です。
document.hの934行目で、Expression:IsObject()と出ています・・・。

よろしければ、書き方、解説の方よろしくお願いします。
他に使いやすいライブラリ等ありましたら教えてください。

c++

1 2//ファイルパスの取得 3 FileUtils* fileUtils = FileUtils::getInstance(); 4 const char* path = "words/serihu.json"; 5 std::string fullpath = fileUtils->fullPathForFilename(path); 6 7 // ファイルオープン 8 std::ifstream inputStream; 9 std::string thisLine; 10 inputStream.open(fullpath.c_str()); 11 if (!inputStream.is_open()) 12 { 13 CCLOG("not file!"); 14 exit(1); 15 } 16 17 std::stringstream sstream; 18 while (getline(inputStream, thisLine)){ 19 sstream << thisLine; 20 } 21 inputStream.close(); 22 23 CCLOG("sstream:%s", sstream.str().c_str()); 24 25 rapidjson::Document d; 26 d.Parse<rapidjson::ParseFlag::kParseDefaultFlags>(sstream.str().c_str()); 27 28 rapidjson::Value& hello = d["serihu_test"]; 29 30 31 CCLOG("%s", hello.GetString()); 32

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

すいません、rapidJSONは使ったことがないので、おすすめのライブラリだけ回答します。
個人的には、dropbox/json11がおすすめです。
かなり直感的に使えると思います。

json11.cpp
json11.hpp
の2つのファイルClasses以下の任意の場所に置いて、json11.hppをインクルードするだけで使用できます。

例えば、こういうJSONがある場合(文字コードはUTF-8 BOMなしで保存する前提)、

json

1{ 2 "id": 1, 3 "name": "テスト", 4 "positions": [ 5 {"x": 100, "y": 120}, 6 {"x": 100, "y": 150}, 7 {"x": 100, "y": 180} 8 ] 9}

このJSONを読み込む処理はこんな感じです。
json11::Jsonはnullptrを代入しても動くので、この例ではパースエラーの際はnullptrを返してます。

cpp

1#include "json11.hpp" 2 3json11::Json parseJson(const std::string& path) { 4 if (!FileUtils::getInstance()->isFileExist(path)) { 5 CCLOG("json file not exist: path=%s", path.c_str()); 6 return nullptr; 7 } 8 9 auto jsonString = FileUtils::getInstance()->getStringFromFile(path); 10 11 std::string err; 12 auto json = json11::Json::parse(jsonString, err); 13 if (!err.empty()) { 14 // パースエラー 15 CCLOG("json parse failed: error=%s", err.c_str()); 16 return nullptr; 17 } 18 19 return json; 20} 21 22void jsonTest() { 23 auto json = parseJson("sample.json"); 24 25 // エラー 26 if (json == nullptr) { 27 return; 28 } 29 30 // 成功 31 int id = json["id"].int_value(); 32 std::string name = json["name"].string_value(); 33 34 CCLOG("id=%d, name=%s", id, name.c_str()); 35 36 for (auto row : json["positions"].array_items()) { 37 float x = row["x"].number_value(); 38 float y = row["y"].number_value(); 39 40 CCLOG("position: x=%.3f, y=%.3f", x, y); 41 } 42} 43 44bool MainScene::init() { 45 if ( !Layer::init() ) { 46 return false; 47 } 48 49 jsonTest(); 50 51 return true; 52}

投稿2017/03/06 15:09

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ファイルを読み込んだ際にゴミが入っていたみたいで、JSONファイルとして認識されてなかったみたいです。
elese関数を使ってゴミを消してやると無事動きました。

投稿2017/03/06 15:06

abebemukkuru

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

hello.GetString()でExpression:IsObject()のアサートのエラーが発生しているんじゃないでしょうか?

JSONは

{"serihu_test":"string"}

ではなく

{"serihu_test":{}}

こんな構造になっていると思います。
ですので、hello.GetString()では文字列を取得できません。

投稿2017/03/06 13:47

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abebemukkuru

2017/03/06 14:28

プログラム上で作った疑似JSON?では表示まで行けました。 const char json[] = " { \"test\" : \"テスト\"}"; これでgetStringで呼べたので、多分、ファイルのロードで解析エラーが出ていたのかもしれません。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問