JSON - 使用cJSON 解析Qt通过UDP发送的JSON数据
1,cJSON支持在C程序中创建和解析JSON数据,其提供多种方法供C程序使用,最直接的是将cJSON.c和cJSON.h加入到C工程中,源代码:https://github.com/DaveGamble/cJSON
2, QJsonObject用于在Qt中创建JSON对象
3,数据传输通过UDP运行
Qt代码如下:
首先在pro文件中加入
QT += network
h文件内容:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include<QtNetwork> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); QUdpSocket *sender;
QByteArray byteArray;
private slots:
void on_pushButton_clicked(); private:
Ui::MainWindow *ui;
}; #endif // MAINWINDOW_H
cpp文件内容:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QJsonObject>
#include<QJsonDocument>
#include<QDebug> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); sender = new QUdpSocket(this); QJsonObject rectJson;
rectJson.insert("Type","Rectangle");
rectJson.insert("height",);
rectJson.insert("widght",); QJsonDocument rectJsonDoc;
rectJsonDoc.setObject(rectJson);
byteArray = rectJsonDoc.toJson(QJsonDocument::Compact); } MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_pushButton_clicked()
{ QHostAddress address;
address.setAddress(QString("192.168.230.140"));
sender->writeDatagram(byteArray.data(),byteArray.size(),
address,);
}
Qt程序通过端口4444,向IP为192.168.230.140的主机发送JSON数据
4,C程序如下:
{
int sock_fd;
char rcv_buff[];
struct sockaddr_in client_addr;
struct sockaddr_in server_addr;
int client_len;
int rcv_num = -;
if ((sock_fd = socket(AF_INET, SOCK_DGRAM,)) < )
{
perror("socket create error\n");
exit();
}
memset(&server_addr,,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons();
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
client_len = sizeof(struct sockaddr_in);
if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < )
{
perror("bind socket error.\n");
exit();
}
while ()
{
/*zero the buff of rvbsm and hvbsm? zhp*/
rcv_num= recvfrom(sock_fd, rcv_buff, sizeof(rcv_buff), , (struct sockaddr*)&client_addr, &client_len);
if (rcv_num>)
{
rcv_buff[rcv_num] = '\0';
printf("rx bsm num = %d\n",rcv_num);
//printf();
printf("%s %u says: %s\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),rcv_buff);
//parse_UDP_data(rcv_num,rcv_buff);
if(rcv_buff != NULL)
{
cJSON* pJson = cJSON_Parse(rcv_buff);
if(pJson == NULL)
{
printf("Json Parse failed.\n");
return ;
}
cJSON* pSub1 = cJSON_GetObjectItem(pJson,"Type");
cJSON* pSub2 = cJSON_GetObjectItem(pJson,"height");
cJSON* pSub3 = cJSON_GetObjectItem(pJson,"widght");
if(pSub1!=NULL)
{
printf("Type : %s\n", pSub1->valuestring);
}
if(pSub2!=NULL)
{
printf("height : %d\n", pSub2->valueint);
}
if(pSub3!=NULL)
{
printf("widght : %d\n", pSub3->valueint);
}
}
}
else
{
perror("recv BSM error\n");
break;
}
}
close(sock_fd);
}
编译C程序:gcc -I. -lm -o rencode *.c
由于cJSON使用了标准数学库,所以在编译中需链接其库文件-lm;
在IP为192.168.230.140的linux服务器中执行./rencode
输出结果为:

JSON - 使用cJSON 解析Qt通过UDP发送的JSON数据的更多相关文章
- QT POST/GET 发送/获取网页数据
#include <QNetworkReply> #include <QNetworkRequest> QNetworkAccessManager *m_accessManag ...
- 使用 Qt 获取 UDP 数据并显示成图片
一个项目,要接收 UDP 数据包,解析并获取其中的数据,主要根据解析出来的行号和序号将数据拼接起来,然后将拼接起来的数据(最重要的数据是 R.G.B 三个通道的像素值)显示在窗口中.考虑到每秒钟要接收 ...
- Java中使用org.json和json-lib解析JSON
文章目录 [隐藏] 一.JavaProject中org.json解析JSON 1.JSON的org.son-api下载 1)JSON网址 2)JSON的java解析org.json-api网址 3) ...
- Qt之JSON生成与解析
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December ...
- 【转载】Qt之JSON生成与解析
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December ...
- 使用cJSON解析JSON
cJSON获取数组元素的每个值 { "operType": 0x5, "field": ["time","matchRule&qu ...
- 使用 Qt 获取 UDP 数据并显示成图片(2)
本文首发于 BriFuture 的 个人博客 在我的前一篇文章 使用 Qt 获取 UDP 数据并显示成图片 中,我讲了如何用 Python 模拟发送数据,如何在 Qt 中高效的接收 UDP 数据包并将 ...
- JSON的简单使用_向前台发送JSON数据
转自:http://www.cnblogs.com/digdeep/p/5574366.html 1.前台页面 <%@ page language="java" conten ...
- .net从网络接口地址获取json,然后解析成对象(一)
整理代码,今天遇到一个问题,就是从一个场景接口获取json,然后解析成对象.之前的时候都好好的,这次返回的json字符串里,由于字符编码的问题,格式上不能转换.一直以为是解析的过程编码有误,试了utf ...
随机推荐
- 【转】成为Linux内核高手的四个方法
我曾经问别人如何开始内核编程的学习,他们基本上都说:①如果你不需要了解内核是如何为你工作的,你为何要尝试呢?②你应该订阅Linux内核邮件列表,然后努力去理解.③如果你不去编写针对Linux内核的代码 ...
- 前端面试题整理(html篇)
1.Doctype作用?标准模式与兼容模式各有什么区别? <!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器用什么文档标准 ...
- 安卓组件-BroadcastReceiver
[转]http://emilyzhou.blog.51cto.com/3632647/685387 一.BroadcastReceiver的简介 用于异步接收广播Intent,广播Intent的发送是 ...
- 3)Javascript设计模式:Observer模式
Observer模式 var Observer = (function() { var instance = null; function Observe() { this.events = {} } ...
- UVa 299 - Train Swapping
题目大意:给n个数的一个序列,通过交换相邻的两个数使得这n个数按照从小到大的顺序排列. Inversion index problem: count how many swaps are needed ...
- Nodejs之模板ejs
ejs使用说明及介绍. 1.创建ejs项目 express -e test //创建模板为ejs的项目,默认为jade. 2.使用 app.js中添加 var ejs = require('ejs' ...
- 一 APPIUM基本理论知识
1.APPIUM介绍 Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用.所谓的“移动原生应用”是指那些用 iOS SDK 或者 A ...
- 在Spring MVC Controller的同一个方法中,根据App还是WEB返回JSON或者HTML视图。
如有高见,欢迎交流! 最近在做一个web的项目,web版已经开发完毕,现在正在进行手机APP的开发,开发中遇到一个问题: 就是web版和app版都有登录功能,本想着是分别走不同的URL,实际开发的时候 ...
- YII 1.0 设置关联模型
在model中设置如下 /* * 设置关联 */ public function relations(){ return array( 'cate'=>array(self::BELONGS_T ...
- 简述Hibernate三种开发方式
1.由domain object->mapping->db(官方推荐) 2.由db开始,用工具生成mapping和domain object(使用较多) 3.由映射文件开始