简体   繁体   中英

Send JSON Object through Zmq with C++ Client - Python Server

i'm trying to exchange a Json object through a c++ client and a python server using zeromq.

server.py

 import zmq
 import json

 context = zmq.Context()
 socket = context.socket(zmq.REP)
 socket.bind("tcp://*:5555")

 while True:
     json_str = socket.recv_json()
     data_print = json.loads(json_str)
     Type = data_print['Type']
     Parameter = data_print['Parameter']
     Value = data_print['Value']
     print(Type,Parameter,Value)

client.cpp

     #include <zmq.hpp> 
     #include <string>
     #include <iostream>
     #include <sstream>
     #include <json/json.h>
     #include <typeinfo>

     class multi_usrp_emulation{
     public:
        void client1(){

            std::string strJson="{\"Type\":\"TX\", \
                                  \"Parameter\" : \"Frequency\" ,\
                                  \"Value\" : \"5.17e9\" \
                                 }";

            Json::Value root;
            Json::Reader reader;
            reader.parse(strJson.c_str(),root);
            Json::FastWriter fastwriter;
            std::string message = fastwriter.write(root);
            zmq::context_t context (1);
            zmq::socket_t socket (context, ZMQ_REQ);
            socket.connect ("tcp://localhost:5555");
            zmq::message_t request (message.size());
            memcpy (request.data (), (message.c_str()), (message.size()));
            socket.send(request);
           }
     };
     int main (void)
     {

        multi_usrp_emulation caller;
        caller.client1();
     }

executing those programs, in the server.py this error accours:

data_print = json.loads(json_str)
File "/usr/lib/python3.4/json/__init__.py", line 312, in loads
   s.__class__.__name__))
TypeError: the JSON object must be str, not 'dict'

I'm using jsoncpp for Json in c++.

How can I exchange a Json message between C++ and Python?

You are trying to convert the json string to a python object twice. Both the following lines return objects, not strings.

json_str = socket.recv_json()
data_print = json.loads(json_str)

Either receive the data with socket.recv_json() and remove the line after it, or receive the data with socket.recv() and then load the string in json_str into a python object with json.loads(json_str) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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