【C++】TwitterのJsonデータとれたのでpicojsonを試してみた備忘録
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【C++】TwitterのJsonデータとれたのでpicojsonを試してみた備忘録

2016-10-10 21:58
    前回Jsonデータとることに成功したのでC++で使えるJsonパーサーを色々と試してみました。
    色々みた感じpicojsonが導入簡単そうだし便利ってことで入れてみた。

    導入はここのpicojson.hを開いてコピー
    VisualStudioの
    新しい項目でpicojson.hを作ってペーストするだけ
    いやー簡単ですね 凄い簡単。感動。
    ってことで作ったあとはmain.cpp
    #include "picojson.h"
    を一番上に入力。簡単。

    で、今度は試しに前回のmain.cppのmain関数のreturn前に

    std::string data;
    wchar_t str2[512];
    char str3[512];


    //読み込み
    std::ifstream ifs(【JSONNAME】);
    picojson::value v;
    ifs >> v;

    //エラー処理
    std::string err = picojson::get_last_error();
    if (!err.empty()){
    std::cerr << err << std::endl;
    return 1;
    }

    //パーサー動かすところ
    if (v.is<picojson::array>()){
    picojson::array& a = v.get<picojson::array>();
    for (picojson::array::iterator i = a.begin(); i != a.end(); ++i){

    //ここには投稿者名出力させたい
    //まだ書いてない

    //Twitterのタイムラインを出力するところ
    picojson::object&obj = (*i).get<picojson::object>();
    data = obj["text"].get<std::string>();
    //UTF-8からShift-JISに変換
    MultiByteToWideChar(CP_UTF8, 0, data.c_str(), strlen(data.c_str()) + 1, str2, MAX_PATH);
    WideCharToMultiByte(CP_ACP, 0, str2, sizeof(str2) / sizeof(str2[0]), str3, sizeof(str3), NULL, NULL);
    std::cout << str3 << "\n" << std::endl;

    }
    }

    と書く。
    UTF-8は一旦Unicodeにしないといけないようなので、UnicodeにしてS-JISに変換。
    エンコード処理はWindows.hをインクルードしないといけないので
    #include <Windows.h>
    を入力。
    保存Jsonファイル名の【JSONNAME】は各自設定してあげてください。

    出力して実行。

    一応タイムラインは取得できたと思う。


    次に投稿者名を取得したいけどuserってオブジェクトを一旦取得しないといけないようなので

    picojson::object&user = obj["user"].get<picojson::object>();
    //ユーザネーム取得
    data = user["name"].get<std::string>();
    //UTF-8からShift-JISに変換
    MultiByteToWideChar(CP_UTF8, 0, data.c_str(), strlen(data.c_str()) + 1, str2, MAX_PATH);
    WideCharToMultiByte(CP_ACP, 0, str2, sizeof(str2) / sizeof(str2[0]), str3, sizeof(str3), NULL, NULL);
    std::cout << str3 << " : "<< std::endl;

    をまだ書いてない部分に入力。
    出力するとできたっぽい。





    (10/10 23:37追記)
    (10/11 3:02追記)
    コンソール上じゃ特殊文字で死ぬのでこの追記はなかったことにしてください

    //UTF-8からShift-JISに変換
    MultiByteToWideChar(CP_UTF8, 0, data.c_str(), strlen(data.c_str()) + 1, str2, MAX_PATH);
    WideCharToMultiByte(CP_ACP, 0, str2, sizeof(str2) / sizeof(str2[0]), str3, sizeof(str3), NULL, NULL);
    std::cout << str3 << " : "<< std::endl;
    としてましたが
    //UTF-8からShift-JISに変換
    MultiByteToWideChar(CP_UTF8, 0, data.c_str(), strlen(data.c_str()) + 1, str2, MAX_PATH);
    //アッカリ~ン
    std::wcout << str2 << " : "<< std::endl; //アッオリ~ン
    こっちのほうが良さそうですね


    参考文献
    (10/11 4:42追記:リンク先間違ってたようなのでリンクつなげ直しました)
    GitHub - a header-file-only, JSON parser serializer in C++
    GET statuses/home_timeline - ホームタイムラインを取得
    俺でもわかるPicojsonの使い方
    boost::property_treeで日本語を含むJSONが文字化けする


    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。