简体   繁体   English

如何使用cpprestsdk从websocket_client解析json数据

[英]How to parse json data from websocket_client using cpprestsdk

I'm connecting to a WebSocket whom always replies in JSON. 我正在连接一个总是以JSON回复的WebSocket。 I see there is an extract_string method for websocket_incoming_message however after trying numerous things with json:value it seems as though you can only construct JSON arrays on-the-fly by inserting key-value pairs one-by-one. 我看到websocket_incoming_message有一个extract_string方法但是在用json:value尝试了很多东西后,似乎你只能通过逐个插入键值对来实时构建JSON数组。 Am I missing something here or is there a way to take the output from websocket_incoming_message and directly convert it into a json:value array? 我在这里遗漏了什么,或者有没有办法从websocket_incoming_message获取输出并直接将其转换为json:value数组?

 websocket_client client;

    //start socket connection to server
        try {

            std::cout << "s


    ----------



            client.connect(U("wss://XZXXXZZy.com/ws?account_id=4de3f308f2f8d3247As70228f94e0d2aAea&ws_key=reception")).wait();

        }
        catch (const std::exception&e)
        {
            std::cout << e.what() << std::endl;
        }

            //send messages to the server

            //websocket_outgoing_message msg;
            //msg.set_pong_message();
            //std::cout << "\n...........2nd.........;";

            //std::string data = "hii";
            //client.send(msg).then([]() { 
            //  
            //  
            //  
            //  
            //  /* Successfully sent the message. */ });
            //std::cout << " Successfully sent the message.";
            //std::cout << "\n...........3rd.........;";



            //receive messages from the server



            client.receive().then([](websocket_incoming_message msg) {
                std::cout << "receiving data from socket";



                return msg.extract_string();


            }).then([](std::string body) {
                //FETCHING THE DATA FROM BODY. "TEXT/JSON"
                std::cout << "displaying the data";
                std::cout << body << std::endl;

                const json::value& v1 = body.substr;




                utility::string_t jsonval = v1.serialize();
                auto array = v1.at(U("rows")).as_array();


                for (int i = 0; i<array.size(); ++i)
                {
                    auto id = array[i].at(U("id")).as_string();
                    std::wcout << "\n" << id;
                    auto key = array[i].at(U("key")).as_string();
                    std::wcout << "\n" << key;
                    auto array2 = array[i].at(U("value")).as_array();

                    std::wcout << array2[0];
                    std::wcout << array2[1];
                }

            }



            );

            //close the connection
            client.close().then([]() {


                std::cout << "successfully close socket connction";


                /* Successfully closed the connection. */
            });



I have json response in my string body.but i dont know how to parse json data from websocket responses event. i want to display contacts from api responses.please help me.. 



MY JSON RESPONSES
--------------------------------------


.{"action":"refresh_dashboard","data":{"users_list":[{"user_id":"901e6076ff351cfc2195fb86f8438a26","extensions":["1002"],"name":"Karthik M"},{"user_id":"cc3f94ecc14ee9c55670dcde9adc1887","extensions":["1006"],"name":"Rounak S Kiran"},{"user_id":"6c29ebdb34e1761fdf9423c573087979","extensions":["1003"],"name":"Amar Nath"},{"user_id":"74d5b5a9aca1faa4c2f217ce87b621d8","extensions":["1008"],"name":"Robin Raju"},{"user_id":"a7ad7e73bf93ea83c8efdc1723cba198","extensions":["1007"],"name":"Arshad Arif"},{"user_id":"b55146df593ec8d09e5fe12a8a4c1108","extensions":["1001"],"name":"Rahib Rasheed"},{"user_id":"3258f7ae4ae1db60435cbcf583f64a89","extensions":["1009"],"name":"Test User"},{"user_id":"90bc84e5e8a3427fe35e99bd4386de95","extensions":["1010"],"name":"Prince T"},{"user_id":"b501ef5b270a196afc0eed557ca74237","extensions":["1005","+17325951060"],"name":"Jineed AJ"},{"user_id":"1422af351e06adeab2de92f5a633a444","extensions":["1004"],"name":"Ashok PA"}],"busy_users":[],"reg_users":[{"user_id":"cc3f94ecc14ee9c55670dcde9adc1887","status":"registered"},{"user_id":"901e6076ff351cfc2195fb86f8438a26","status":"registered"},{"user_id":"1422af351e06adeab2de92f5a633a444","status":"registered"},{"user_id":"3258f7ae4ae1db60435cbcf583f64a89","status":"registered"},{"user_id":"b55146df593ec8d09e5fe12a8a4c1108","status":"registered"},{"user_id":"6c29ebdb34e1761fdf9423c573087979","status":"registered"}],"contacts":[{"owner_id":"cc3f94ecc14ee9c55670dcde9adc1887","status":"ready"},{"owner_id":"901e6076ff351cfc2195fb86f8438a26","status":"ready"},{"owner_id":"1422af351e06adeab2de92f5a633a444","status":"ready"},{"owner_id":"3258f7ae4ae1db60435cbcf583f64a89","status":"ready"},{"owner_id":"b55146df593ec8d09e5fe12a8a4c1108","status":"ready"},{"owner_id":"6c29ebdb34e1761fdf9423c573087979","status":"ready"}]}}

I got the complete solution .please try to use boost pacakges from nuget. 我得到了完整的解决方案。请尝试使用nuget的boost pacakges。 The documentation will help you to parse the json data from string. 该文档将帮助您解析字符串中的json数据。 I think jsoncpp is not an updated packages available in the nuget.so please try boost packages available in the nuget. 我认为jsoncpp不是nuget中的更新包。所以请尝试在nuget中提供的提升包。

MYJSON STRING MYJSON STRING

{"action":"refresh_dashboard","data":{"users_list":[{"user_id":"901e6076ff351cfc2195fb86f8438a26","extensions":["1002"],"name":"Karthik M"},{"user_id":"7d617ef5b2390d081d901b0d5cd108eb","extensions":["1015"],"name":"Synway User2"},{"user_id":"c8f667f7d663e81f6e7fa34b9296f067","extensions":["1012"],"name":"Rahib Video"},{"user_id":"cc3f94ecc14ee9c55670dcde9adc1887","extensions":["1006"],"name":"Rounak S Kiran"},{"user_id":"6c29ebdb34e1761fdf9423c573087979","extensions":["1003"],"name":"Amar Nath"},{"user_id":"8e15c2d95d4325cb07f0750846966be8","extensions":["1011"],"name":"TLS User"},{"user_id":"2fc4142bdacf83c1957bda0ad9d50e3d","extensions":["1014"],"name":"Synway User1"},{"user_id":"74d5b5a9aca1faa4c2f217ce87b621d8","extensions":["1008"],"name":"Robin Raju"},{"user_id":"a7ad7e73bf93ea83c8efdc1723cba198","extensions":["1007"],"name":"Arshad Arif"},{"user_id":"b55146df593ec8d09e5fe12a8a4c1108","extensions":["1001"],"name":"Rahib Rasheed"},{"user_id":"391391de005a8f5403c7b5591f462ea1","ex {“action”:“refresh_dashboard”,“data”:{“users_list”:[{“user_id”:“901e6076ff351cfc2195fb86f8438a26”,“extensions”:[“1002”],“name”:“Karthik M”},{“ user_id“:”7d617ef5b2390d081d901b0d5cd108eb“,”extensions“:[”1015“],”name“:”Synway User2“},{”user_id“:”c8f667f7d663e81f6e7fa34b9296f067“,”extensions“:[”1012“],”name“: “Rahib Video”},{“user_id”:“cc3f94ecc14ee9c55670dcde9adc1887”,“extensions”:[“1006”],“name”:“Rounak S Kiran”},{“user_id”:“6c29ebdb34e1761fdf9423c573087979”,“extensions”:[ “1003”],“name”:“Amar Nath”},{“user_id”:“8e15c2d95d4325cb07f0750846966be8”,“extensions”:[“1011”],“name”:“TLS User”},{“user_id”:“ 2fc4142bdacf83c1957bda0ad9d50e3d“,”extensions“:[”1014“],”name“:”Synway User1“},{”user_id“:”74d5b5a9aca1faa4c2f217ce87b621d8“,”extensions“:[”1008“],”name“:”Robin Raju“ },{“user_id”:“a7ad7e73bf93ea83c8efdc1723cba198”,“extensions”:[“1007”],“name”:“Arshad Arif”},{“user_id”:“b55146df593ec8d09e5fe12a8a4c1108”,“extensions”:[“1001”], “name”:“Rahib Rasheed”},{“user_id”:“391391de005a8f5403c7b5591f462ea1”,“ex tensions":["1013"],"name":"Sangeeth J"},{"user_id":"3258f7ae4ae1db60435cbcf583f64a89","extensions":["1009"],"name":"Aby TL"},{"user_id":"90bc84e5e8a3427fe35e99bd4386de95","extensions":["1010"],"name":"Prince T"},{"user_id":"b501ef5b270a196afc0eed557ca74237","extensions":["1005"],"name":"Jineed AJ"},{"user_id":"1422af351e06adeab2de92f5a633a444","extensions":["1004"],"name":"Ashok PA"}],"busy_users":[],"reg_users":[{"user_id":"901e6076ff351cfc2195fb86f8438a26","status":"registered"},{"user_id":"6c29ebdb34e1761fdf9423c573087979","status":"registered"}],"contacts":[{"owner_id":"901e6076ff351cfc2195fb86f8438a26","status":"ready"},{"owner_id":"6c29ebdb34e1761fdf9423c573087979","status":"ready"}]}} 紧张局势“:[”1013“],”名称“:”Sangeeth J“},{”user_id“:”3258f7ae4ae1db60435cbcf583f64a89“,”extensions“:[”1009“],”name“:”Aby TL“},{” user_id“:”90bc84e5e8a3427fe35e99bd4386de95“,”extensions“:[”1010“],”name“:”Prince T“},{”user_id“:”b501ef5b270a196afc0eed557ca74237“,”extensions“:[”1005“],”name“: “Jineed AJ”},{“user_id”:“1422af351e06adeab2de92f5a633a444”,“extensions”:[“1004”],“name”:“Ashok PA”}],“busy_users”:[],“reg_users”:[{“ USER_ID “:” 901e6076ff351cfc2195fb86f8438a26" , “状态”: “注册”},{ “USER_ID”: “6c29ebdb34e1761fdf9423c573087979”, “状态”: “注册”}], “接触”:[{ “owner_id”: “901e6076ff351cfc2195fb86f8438a26”,”状态 “:” 准备好了 “},{” owner_id “:” 6c29ebdb34e1761fdf9423c573087979" , “状态”: “准备就绪”}]}}

CODES

client.receive().then([](websocket_incoming_message msg) {
            std::cout << "receiving data from socket";

            // msg.message_type();
            return msg.extract_string();
            //1..i have one string
            //cout<<"\n///////////test"<< msg.extract_string().get().c_str();
            //  // 2.convert to json array
            //json::value::parse(   ::to_string_t(msg.extract_string().get()))
            //

        }).then([](std::string body) {

            //std::cout << "displaying the data";
            std::cout << body << std::endl;


            std::string ss = body;
            ptree pt;
            std::istringstream is(ss);
            read_json(is, pt);

            std::cout <<"\n 1st"<< "action:     " << pt.get<std::string>("action") << "\n";
            std::cout <<"\n 2nd"<< "data: " << pt.get<std::string>("data") << "\n";
            std::cout << "--------------------------------------------------------------";
            for (auto& e : pt.get_child("data.users_list")) {
            std::cout << "\n" << "users id " << e.second.get<std::string>("user_id") << "\n";


            }
        });

useful resources 有用的资源

  1. Parse JSON array as std::string with Boost ptree 使用Boost ptree将JSON数组解析为std :: string

  2. C++ boost parse dynamically generated json string (not a file) C ++ boost解析动态生成的json字符串(不是文件)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM