C ++ boost json ptree parser не может разобрать строку

Я пытаюсь отправить сообщения JSON через Boost message_queue, используя ptree для локального хранения информации.

это код получателя:

#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <string>
//#include <boost/archive/text_iarchive.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/serialization/string.hpp>
using boost::interprocess::message_queue;
using boost::property_tree::ptree; using boost::property_tree::read_json;
#define MAX_SIZE 1000int main()
{
message_queue mq (boost::interprocess::open_or_create,"coda",10,MAX_SIZE);
message_queue::size_type recv_size;
unsigned int priority;
ptree pt;

std::stringstream iss;
std::string serialized_string;
serialized_string.resize(MAX_SIZE);
mq.receive(&serialized_string[0],MAX_SIZE,recv_size,priority);
iss << serialized_string;
std::istringstream is(iss.str());
read_json(is, pt);

std::cout pt.get<std::string>("prefix") << pt.get<std::string>("faceID") << std::endl;

}

и это код отправителя:

#include <boost/interprocess/ipc/message_queue.hpp>
#include <boost/serialization/string.hpp>
#include <string>
#include <sstream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::interprocess::message_queue;
using boost::property_tree::ptree; using boost::property_tree::write_json;#define MAX_SIZE 1000void send(ptree pt)
{
std::stringstream oss;
write_json(oss,pt);

std::string serialized_strings(oss.str());
message_queue mq(boost::interprocess::open_only,"coda");
mq.send(serialized_strings.data(), serialized_strings.size(),0);
std::cout << oss.str() << std::endl;
}

int main()
{
ptree pt;
pt.put("prefix","standard");
pt.put("faceID",42);
send(pt);
}

отправитель работает и имеет такой вывод:

$ ./sendptree
{
"prefix": "standard",
"faceID": "42"}

получатель получает данные правильно, но не может их проанализировать (с помощью вызова read_json).

$ ./recvptree
{
"prefix": "standard",
"faceID": "42"}

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::property_tree::json_parser::json_parser_error> >'
what():  <unspecified file>(5): expected end of input
[1]    24052 abort      ./recvptree

3

Решение

Я думаю, что просто ваш буфер приема не был нулевым. Этот код работает:

Сервер:

#include <boost/interprocess/ipc/message_queue.hpp>
#include <boost/serialization/string.hpp>
#include <string>
#include <sstream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::interprocess::message_queue;
using boost::property_tree::ptree; using boost::property_tree::write_json;#define MAX_SIZE 1000

void send(ptree pt)
{
std::stringstream oss;
write_json(oss,pt);

message_queue mq(boost::interprocess::open_or_create,"coda",10,MAX_SIZE);
mq.send(oss.str().c_str(), oss.str().size(),0);
std::cout << oss.str() << std::endl;
system("PAUSE");
}

int main()
{
ptree pt;
pt.put("prefix","standard");
pt.put("faceID",42);
send(pt);
}

Клиент:

#include <boost/interprocess/ipc/message_queue.hpp>
#include <string>
#include <strstream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/serialization/string.hpp>
using boost::interprocess::message_queue;
using boost::property_tree::ptree;
using boost::property_tree::read_json;
#define MAX_SIZE 1000int main()
{
message_queue mq (boost::interprocess::open_or_create,"coda",10,MAX_SIZE);
size_t recv_size;
unsigned int priority;
ptree pt;

char buffer[MAX_SIZE];
mq.receive(buffer,MAX_SIZE,recv_size,priority);
buffer[recv_size] = 0;
std::istrstream is(buffer);
read_json(is, pt);

std::cout << "prefix: " << pt.get<std::string>("prefix") << " -- faceID: " << pt.get<std::string>("faceID") << std::endl;
system("PAUSE");
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector