cjson庫的c文件,c++ cjson

本文目錄一覽:

請教Qt如何解析出Json的數據

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。它基於JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。

常用的Json庫

JsonCpp

JsonCpp是一個C++用來處理JSON數據的開發包。

網址:.

cJSON

cJSON是一個超輕巧,攜帶方便,單文件,簡單的可以作為ANSI-C標準的JSON解析器。

網址:.

QJson

QJson是一個基於Qt的開發包用來將JSON數據解析成QVariant對象,JSON的數組將被映射為QVariantList實例,而其他對象映射為QVariantMap實例。

網址:.

關於Qt中對JSON的生成與解析,Qt5以前的版本,需要去進行單獨下載、編譯,才能使用。到了Qt5,提供了專門的QJsonDocument類來讀取和寫入JSON文檔。

Qt5中JSON的生成與解析

QJsonDocument

QJsonDocument既可以從一個基於文本表示的UTF-8編碼,又可以從Qt自己的二進制格式讀取和寫入這個文件。

JSON文檔可以從它的基於文本的表示使用QJsonDocument::fromJson()轉換為QJsonDocument,用.toJSON()將其轉換迴文字。解析器非常快速和高效,將JSON轉換為二進制表示。

QJsonObject

QJsonObject類用於封裝JSON對象。

JSON對象是鍵值對,其中鍵是唯一的字符串,其值由QJsonValue代表。一個QJsonObject可以從QVariantMap轉換/被轉換。

QJsonArray

QJsonArray類用於封裝JSON數組。

一個JSON數組列表值。該列表可以通過從陣列插入和移除QJsonValue的操縱。一個QJsonArray可以從QVariantList轉換為/被轉換。

QJsonDocument有效解析後的文檔可以使用!iSNull()判斷。使用isArray()和isObject()來判斷是否包含一個數組或對象。文檔中包含的數組或對象可以使用array()或object()進行檢索,然後讀取或操縱。

示例

QJsonObject

(1)生成Json

QJsonObject json;

json.insert(“name”, QString(“Qt”));

json.insert(“version”, 5);

json.insert(“windows”, true);

QJsonDocument document;

document.setObject(json);

QByteArray byte_array = document.toJson(QJsonDocument::Compact);

QString json_str(byte_array);

結果:

json_str:{“name”: “Qt”,”version”: 5,”windows”: true}

(2)解析Json

QJsonParseError json_error;

QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, json_error);

if(json_error.error == QJsonParseError::NoError)

{

if(parse_doucment.isObject())

{

QJsonObject obj = parse_doucment.object();

if(obj.contains(“name”))

{

QJsonValue name_value = obj.take(“name”);

if(name_value.isString())

{

QString name = name_value.toString();

}

}

if(obj.contains(“version”))

{

QJsonValue version_value = obj.take(“version”);

if(version_value.isDouble())

{

int version = version_value.toVariant().toInt();

}

}

if(obj.contains(“windows”))

{

QJsonValue version_value = obj.take(“windows”);

if(version_value.isBool())

{

bool flag = version_value.toBool();

}

}

}

}

結果:

name:Qt

version:5

windows:true

QJsonArray

(1)生成Json

QJsonArray json;

json.insert(0, QString(“Qt”));

json.insert(1, QString(“version”));

json.insert(2, true);

QJsonDocument document;

document.setArray(json);

QByteArray byte_array = document.toJson(QJsonDocument::Compact);

QString json_str(byte_array);

結果:

json_str:[“Qt”,”version”,true]

(2)解析Json

QJsonParseError json_error;

QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, json_error);

if(json_error.error == QJsonParseError::NoError)

{

if(parse_doucment.isArray())

{

QJsonArray array = parse_doucment.array();

int size = array.size();

for(int i=0; i

{

QJsonValue value = array.at(i);

if(value.isString())

{

QString name = value.toString();

}

else if(value.isBool())

{

bool flag = value.toBool();

}

}

}

}

結果:

數組不同下標對應的值

0:Qt

1:version

2:true

如上,簡單介紹一下常用的JSON庫以及Qt中對JSON的生成與解析,如需更多資料請參考官方文檔,還是那句話,沒有比助手更好、更專業的資料了!

怎麼用C語言獲取JSON中的數據?

用C語言獲取JSON中的數據的方法是使用 CJSON。

以下簡單介紹用CJSON的思路及實現:

1)創建json,從json中獲取數據。

#nclude stdio.h

#include “cJSON.h”

char * makeJson()

{

cJSON * pJsonRoot = NULL;

pJsonRoot = cJSON_CreateObject();

if(NULL == pJsonRoot)

{

//error happend here

return NULL;

}

cJSON_AddStringToObject(pJsonRoot, “hello”, “hello world”);

cJSON_AddNumberToObject(pJsonRoot, “number”, 10010);

cJSON_AddBoolToObject(pJsonRoot, “bool”, 1);

cJSON * pSubJson = NULL;

pSubJson = cJSON_CreateObject();

if(NULL == pSubJson)

{

// create object faild, exit

cJSON_Delete(pJsonRoot);

return NULL;

}

cJSON_AddStringToObject(pSubJson, “subjsonobj”, “a sub json string”);

cJSON_AddItemToObject(pJsonRoot, “subobj”, pSubJson);

char * p = cJSON_Print(pJsonRoot);

// else use :

// char * p = cJSON_PrintUnformatted(pJsonRoot);

if(NULL == p)

{

//convert json list to string faild, exit

//because sub json pSubJson han been add to pJsonRoot, so just delete pJsonRoot, if you also delete pSubJson, it will coredump, and error is : double free

cJSON_Delete(pJsonRoot);

return NULL;

}

//free(p);

cJSON_Delete(pJsonRoot);

return p;

}

void parseJson(char * pMsg)

{

if(NULL == pMsg)

{

return;

}

cJSON * pJson = cJSON_Parse(pMsg);

if(NULL == pJson)

{

// parse faild, return

return ;

}

// get string from json

cJSON * pSub = cJSON_GetObjectItem(pJson, “hello”);

if(NULL == pSub)

{

//get object named “hello” faild

}

printf(“obj_1 : %s\n”, pSub-valuestring);

// get number from json

pSub = cJSON_GetObjectItem(pJson, “number”);

if(NULL == pSub)

{

//get number from json faild

}

printf(“obj_2 : %d\n”, pSub-valueint);

// get bool from json

pSub = cJSON_GetObjectItem(pJson, “bool”);

if(NULL == pSub)

{

// get bool from json faild

}

printf(“obj_3 : %d\n”, pSub-valueint);

// get sub object

pSub = cJSON_GetObjectItem(pJson, “subobj”);

if(NULL == pSub)

{

// get sub object faild

}

cJSON * pSubSub = cJSON_GetObjectItem(pSub, “subjsonobj”);

if(NULL == pSubSub)

{

// get object from subject object faild

}

printf(“sub_obj_1 : %s\n”, pSubSub-valuestring);

cJSON_Delete(pJson);

}

int main()

{

char * p = makeJson();

if(NULL == p)

{

return 0;

}

printf(“%s\n”, p);

parseJson(p);

free(p);//這裡不要忘記釋放內存,cJSON_Print()函數或者cJSON_PrintUnformatted()產生的內存,使用free(char *)進行釋放

return 0;

}

2)創建json數組和解析json數組

//創建數組,數組值是另一個JSON的item,這裡使用數字作為演示

char * makeArray(int iSize)

{

cJSON * root = cJSON_CreateArray();

if(NULL == root)

{

printf(“create json array faild\n”);

return NULL;

}

int i = 0;

for(i = 0; i iSize; i++)

{

cJSON_AddNumberToObject(root, “hehe”, i);

}

char * out = cJSON_Print(root);

cJSON_Delete(root);

return out;

}

//解析剛剛的CJSON數組

void parseArray(char * pJson)

{

if(NULL == pJson)

{

return ;

}

cJSON * root = NULL;

if((root = cJSON_Parse(pJson)) == NULL)

{

return ;

}

int iSize = cJSON_GetArraySize(root);

for(int iCnt = 0; iCnt iSize; iCnt++)

{

cJSON * pSub = cJSON_GetArrayItem(root, iCnt);

if(NULL == pSub)

{

continue;

}

int iValue = pSub-valueint;

printf(“value[%2d] : [%d]\n”, iCnt, iValue);

}

cJSON_Delete(root);

return;

}

有兩種方法:

一是標準的輸出輸入方式 比如新建一個磁盤文件c:\a.txt, 將鍵盤輸入的一字符串寫到文件中:

FILE *ft;

char str[50];

ft=fopen(“c:\\a.txt”,”w+”);

printf(“輸入一個字符串:”);

scanf(“%s”,str);

fputs(str,ft);

fclose(ft);

//重新打開這個文件並讀出字符串,顯示在屏幕上 ft=fopen(“c:\\a.txt”,”rt”);

fgets(str,50,ft);

fclose(ft); printf(“%s”,str);

二是低級輸入輸出方式 仍如上例:

int hd; char str[50]; printf(“輸入一個字符串:”);

scanf(“%s”,str);

hd=open(“c:\\a.txt”,O_CREAT|O_TEXT|O_WRONLY);

write(hd,str,strlen(str));

close(hd); //重新打開這個文件並讀出字符串,顯示在屏幕上。

hd=open(“c:\\a.txt”,O_TEXT|O_RDONLY); read(hd,str,50);

close(hd); printf(“%s”,str)。

cjson嵌套多少層

四五層。cjsonN是C語言寫的一個JSON解析庫程序。該程序為更好的方便用戶的使用,提高用戶的辦事效率,所以該程序是嵌套四五層的。並且該程序憑藉其極高的辦事效率受到很多用戶的喜歡青睞。

誰給推薦一個C++的JSON庫

jsoncpp、還有cJSON,推薦cJSON這個輕量級的JSON庫,它使用起來非常簡單,只需要把cJSON.c和cJSON.h兩個文件複製到你的項目中就可以了,使用時#include “cJSON.h”。cJSON可以在github上下載,github上還有一段簡單的使用說明,cJSON庫可以解析JSON,也可以生成JSON文件,用cJSON一般只用寫4、5行代碼(所以說它的輕量級的)。

如何優雅地使用c語言編寫爬蟲

前言

大家在平時或多或少地都會有編寫網絡爬蟲的需求。一般來說,編寫爬蟲的首選自然非python莫屬,除此之外,java等語言也是不錯的選擇。選擇上述語言的原因不僅僅在於它們均有非常不錯的網絡請求庫和字符串處理庫,還在於基於上述語言的爬蟲框架非常之多和完善。良好的爬蟲框架可以確保爬蟲程序的穩定性,以及編寫程序的便捷性。所以,這個cspider爬蟲庫的使命在於,我們能夠使用c語言,依然能夠優雅地編寫爬蟲程序。

爬蟲的特性

配置方便。使用一句設置函數,即可定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。

程序邏輯獨立。用戶可以分別定義爬蟲的解析函數,和數據持久化函數。並且對於解析到的新url,用戶可以使用cspider提供的addUrl函數,將其加入到任務隊列中。

便捷的字符串處理。cspider中提供了基於pcre的簡單的正則表達式函數,基於libxml2的xpath解析函數,以及用於解析json的cJSON庫。

高效的抓取。cspider基於libuv調度抓取線程和解析線程,使用curl作為其網絡請求庫。

使用cspider的步驟

獲取cspider_t。

自定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。

添加初始要抓取的url到任務隊列。

編寫解析函數和數據持久化函數。

啟動爬蟲。

例子

先來看下簡單的爬蟲例子,會在後面詳細講解例子。

#includecspider/spider.h

/*

自定義的解析函數,d為獲取到的html頁面字符串

*/

void p(cspider_t *cspider, char *d, void *user_data) {

char *get[100];

//xpath解析html

int size = xpath(d, “//body/div[@class=’wrap’]/div[@class=’sort-column area’]/div[@class=’column-bd cfix’]/ul[@class=’st-list cfix’]/li/strong/a”, get, 100);

int i;

for (i = 0; i size; i++) {

//將獲取到的電影名稱,持久化

saveString(cspider, get[i]);

}

}

/*

數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進行進一步的保存

*/

void s(void *str, void *user_data) {

char *get = (char *)str;

FILE *file = (FILE*)user_data;

fprintf(file, “%s\n”, get);

return;

}

int main() {

//初始化spider

cspider_t *spider = init_cspider();

char *agent = “Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0”;

//char *cookie = “bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qq.com; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280”;

//設置要抓取頁面的url

cs_setopt_url(spider, “so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html”);

//設置user agent

cs_setopt_useragent(spider, agent);

//cs_setopt_cookie(spider, cookie);

//傳入解析函數和數據持久化函數的指針

cs_setopt_process(spider, p, NULL);

//s函數的user_data指針指向stdout

cs_setopt_save(spider, s, stdout);

//設置線程數量

cs_setopt_threadnum(spider, DOWNLOAD, 2);

cs_setopt_threadnum(spider, SAVE, 2);

//FILE *fp = fopen(“log”, “wb+”);

//cs_setopt_logfile(spider, fp);

//開始爬蟲

return cs_run(spider);

}

例子講解

cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類函數可以用來進行初始化設置。其中要注意的是: cs_setopt_process(spider,p,NULL);與cs_setopt_save(spider,s,stdout);,它們分別設置了解析函數p和數據持久化函數s,這兩個函數需要用戶自己實現,還有用戶自定義的指向上下文信息user_data的指針。

在解析函數中,用戶要定義解析的規則,並對解析得到的字符串可以調用saveString進行持久化,或者是調用addUrl將url加入到任務隊列中。在saveString中傳入的字符串會在用戶自定義的數據持久函數中得到處理。此時,用戶可以選擇輸出到文件或數據庫等。

最後調用cs_run(spider)即可啟動爬蟲。

具體的API參數可在這裡查看

總結

趕快使用cspider爬蟲框架來編寫爬蟲吧!如果在使用過程中發現bug,歡迎反饋。

望採納,謝謝

java怎麼實現JSON打包UDP

java實現JSON打包UDP cJSON支持在C程序中創建和解析JSON數據,其提供多種方法供C程序使用,最直接的是將cJSON.c和cJSON.h加入到C工程中

(1) QJsonObject用於在Qt中創建JSON對象

(2)數據傳輸通過UDP運行

代碼如下

首先在pro文件中加入

QT += network

h文件內容:

首先在pro文件中加入

QT += network

h文件內容:

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include QMainWindow

#includeQtNetwork

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

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”

#includeQJsonObject

#includeQJsonDocument

#includeQDebug

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

}

程序通過端口4444,向IP為192.168.230.140的主機發送JSON數據

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

{

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

輸出結果為:

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/270150.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:35
下一篇 2024-12-16 13:35

相關推薦

  • vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常問題的解決

    本文旨在解決vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常的問題,提供完整的代碼示例供參考。 一、分析問題 首先,需了解vue中下載文件的情況。一般情況下,我們…

    編程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • 為什麼用cmd運行Java時需要在文件內打開cmd為中心

    在Java開發中,我們經常會使用cmd在命令行窗口運行程序。然而,有時候我們會發現,在運行Java程序時,需要在文件內打開cmd為中心,這讓很多開發者感到疑惑,那麼,為什麼會出現這…

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • Python zipfile解壓文件亂碼處理

    本文主要介紹如何在Python中使用zipfile進行文件解壓的處理,同時詳細討論在解壓文件時可能出現的亂碼問題的各種解決辦法。 一、zipfile解壓文件亂碼問題的根本原因 在P…

    編程 2025-04-29
  • Python如何導入py文件

    Python是一種開源的高級編程語言,因其易學易用和強大的生態系統而備受青睞。Python的import語句可以幫助用戶將一個模塊中的代碼導入到另一個模塊中,從而實現代碼的重用。本…

    編程 2025-04-29
  • Python合併多個相同表頭文件

    對於需要合併多個相同表頭文件的情況,我們可以使用Python來實現快速的合併。 一、讀取CSV文件 使用Python中的csv庫讀取CSV文件。 import csv with o…

    編程 2025-04-29
  • Python寫文件a

    Python語言是一種功能強大、易於學習、通用並且高級編程語言,它具有許多優點,其中之一就是能夠輕鬆地進行文件操作。文件操作在各種編程中都佔有重要的位置,Python作為開發人員常…

    編程 2025-04-29

發表回復

登錄後才能評論