JSON
来源:互联网 发布:淘宝差评后卖家报复 编辑:程序博客网 时间:2024/06/06 19:40
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_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~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",42); rectJson.insert("widght",23); 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,4444);}
Qt程序通过端口4444,向IP为192.168.230.140的主机发送JSON数据
4,C程序如下:
{ int sock_fd; char rcv_buff[512]; struct sockaddr_in client_addr; struct sockaddr_in server_addr; int client_len; int rcv_num = -1; if ((sock_fd = socket(AF_INET, SOCK_DGRAM,0)) < 0) { perror("socket create error\n"); exit(1); } memset(&server_addr,0,sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(4444); 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)) < 0) { perror("bind socket error.\n"); exit(1); } while (1) { /*zero the buff of rvbsm and hvbsm? zhp*/ rcv_num= recvfrom(sock_fd, rcv_buff, sizeof(rcv_buff), 0, (struct sockaddr*)&client_addr, &client_len); if (rcv_num>0) { 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 0; } 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
输出结果为:
0 0
- Json
- JSON
- JSON
- JSON
- json
- JSON
- JSON
- json
- Json
- json
- JSON
- json
- json
- JSON
- json
- JSON
- JSON
- json
- Android 自定义 View 圆形进度条总结
- JAVA学习中Swing概述中的JFrame学习
- 如何符合w3c规范?
- Windows server 2008 企业版 Sqlserver2008标准版在IBM X3650上实现双机热备3
- Android 弹幕的实现其实很简单
- JSON
- JAVA学习中Swing部分JDialog对话框窗体的简单学习
- xPath表达式
- ABAP DOI详解(2)
- 【译】如何在 Android 5.0 上获取 SD卡 的读写权限
- JAVA学习Swing章节标签JLabel中图标的使用
- jQuery的基本语法
- Qt
- Oracle临时表和SQL Server临时表的…