3

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?

1 Answer 1

1

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).

Sign up to request clarification or add additional context in comments.

2 Comments

is there a c++ method for socket.recv_json() ?
I don't believe there is. This page api.zeromq.org/2-1:zmq-cpp documents a slightly old version of the api, but there don't seem to be any methods on the socket object to deal directly with json.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.