jsoncpp 库的使用.
//2.测试一下jsoncpp库是否好使.
Json::Value root;
Json::Value data;
root["action"] = "run";
data["number"] = 1;
root["data"] = data;
Json::FastWriter writer;
std::string json_str = writer.write(root);
RCLCPP_INFO(this->get_logger(), "json:'%s' --> test ", json_str.c_str());
//3.解析json数据
Json::Value root1;
Json::Reader reader;
reader.parse(json_str, root1);
string action_ = root1["action"].asString();
Json::Value data1 = root1["data"];
string number_ = data1["number"].asString();
RCLCPP_INFO(this->get_logger(), "json_parse:'%s', '%s' --> test ", action_.c_str(), number_.c_str());
ros2 工程配置
jsoncpp 通过源码形式加入Qt项目
注:经jsoncpp 编译成c++库,通过Qt工程调用,出现一个指针转换的错误,个人认为是c++11标准没有添加到Qt工程中导致的。
上图由于我的项目中缺少c++语言标准的设置,不清楚是因为什么
故采用另外一个方案,将jsoncpp源码库集成到Qt工程中,即可使用,编译运行没有任何问题,记录一下.
#include "JsonTest.h"
#include <iostream>
#include <QDebug>
//#include "QJson/parser.h"
//#include "QJson/serializer.h"
//#include "QJson/qobjecthelper.h"
#include "json/json.h"
JsonTest::JsonTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
generate_json_string();
}
void JsonTest::generate_json_string()
{
/* QJsonDocument jdoc;
QJsonObject obj;
QJsonArray arr;*/
Json::Value root;
Json::Value data;
root["action"] = "run";
data["number"] = 1;
root["data"] = data;
Json::FastWriter writer;
std::string json_str = writer.write(root);
qDebug() << "json_str:" << QString::fromStdString(json_str);
}
void JsonTest::parse_json_string()
{
}
jsoncpp 打包数组数据
Json::Value root;
Json::Value dev;
Json::FastWriter writer;
Json::Value topic_msg;
for (int i = 0; i < tasks.size(); i++) {
dev["id"] = tasks[i].uav_id_;
dev["lon"] = tasks[i].target_pos_[0] * 10000000; //1E7 deg
dev["lat"] = tasks[i].target_pos_[1] * 10000000; //1E7 deg
dev["alt"] = tasks[i].target_pos_[2] * 10000000; //1E7 deg
root.append(dev);
qDebug() << "uav_id:" << tasks[i].uav_id_ << " lon:" << tasks[i].target_pos_[0] << " lat:" << tasks[i].target_pos_[1] << " alt:" << tasks[i].target_pos_[2];
}
//将json对象转换为json字符串
Json::String str = writer.write(root);
模拟发送接收数据
由于linux中ros系统与win10中的qgis系统进行通信,故需要使用rosbridge桥,进行中间消息转换。
故写了一段测试转换的代码
//1.测试json数据解析, 模拟接收线程,接收到无人机位置信息数据.
Json::Value msg;
Json::Reader reader;
Json::FastWriter writer;
Json::Value uav_pos;
Json::Value dev; // 无人机位置信息 json
Json::Value data; //
dev["id"] = 100; //无人机id
dev["lon"] = 1001234567;
dev["lat"] = 341234567;
dev["alt"] = 300;
//2.模拟无人机发送的位置信息代码,将数据进行打包.
uav_pos["data"] = dev; //"data" 字段对应 ros系统中 std_msgs/String 类型的消息.
Json::String str = writer.write(uav_pos); //位置信息整体打包.
qDebug() << "uav_pos --> " << QString::fromStdString(str);
//3.接收到的数据.应为QString类型,需要转换为Json::String类型
QString q_str = QString::fromStdString(str);
reader.parse(q_str.toStdString(), msg);
data = msg["data"];
qDebug() << "uav_pos --> " << "id:" << data["id"].asInt() << " lon:" << data["lon"].asInt() << " lat:" << data["lat"].asInt() << " alt:" << data["alt"].asInt();