json response
时间: 2025-06-29 21:15:34 浏览: 6
### 构建和解析 JSON 响应
#### 使用 C 语言中的 cJSON 库构建和解析 JSON 响应
对于C语言而言,可以利用`cJSON`库来进行JSON的创建与解析操作。此部分会详细介绍如何使用该库完成上述需求。
##### 创建 JSON 响应
为了创建一个简单的 JSON 对象,在 `createJson.c` 文件中定义了一个函数用于生成指定格式的数据[^1]:
```c
#include "cJSON.h"
void create_json_response() {
// 初始化根节点
cJSON *root = cJSON_CreateObject();
// 添加键值对到根节点
cJSON_AddStringToObject(root, "status", "success");
cJSON_AddNumberToObject(root, "code", 200);
// 创建子对象并添加至根节点
cJSON *data = cJSON_CreateObject();
cJSON_AddItemToObject(data, "id", cJSON_CreateNumber(1));
cJSON_AddItemToObject(data, "name", cJSON_CreateString("example"));
cJSON_AddItemToObject(root, "data", data);
char *json_str = cJSON_PrintUnformatted(root); // 打印成字符串形式
printf("%s\n", json_str);
free(json_str); // 记得释放分配的空间
cJSON_Delete(root); // 删除整个树形结构
}
```
##### 解析 JSON 响应
当接收到外部传入的一个 JSON 字符串时,则可以通过如下方式对其进行解析处理:
假设有一个名为 `test.txt` 的文件包含了待解析的内容:
```json
{
"status": "success",
"code": 200,
"data": {
"id": 1,
"name": "example"
}
}
```
对应的读取与解析逻辑可以在 `jsonTest.c` 实现 :
```c
#include <stdio.h>
#include "cJSON.h"
int parse_json_response(const char* filename){
FILE *fp;
long length;
char *buffer;
fp = fopen(filename,"rb+");
fseek(fp,0,SEEK_END);
length=ftell(fp);
rewind(fp);
buffer=(char *)malloc(length+1);
fread(buffer,length,1,fp);
fclose(fp);
cJSON *root=cJSON_Parse(buffer);
if (!root) {printf("Error before:%s\n",cJSON_GetErrorPtr());return -1;}
const cJSON *status = cJSON_GetObjectItemCaseSensitive(root, "status");
if(cJSON_IsString(status)){
printf("Status : %s \n", status->valuestring);
}
const cJSON *code = cJSON_GetObjectItemCaseSensitive(root, "code");
if(cJSON_IsNumber(code)){
printf("Code : %d \n", code->valueint);
}
const cJSON *data = cJSON_GetObjectItemCaseSensitive(root, "data");
if (cJSON_HasObjectItem(data, "id") && cJSON_HasObjectItem(data, "name")) {
int id = cJSON_GetObjectItem(data, "id")->valueint;
const char *name = cJSON_GetObjectItem(data, "name")->valuestring;
printf("Data ID: %d , Name: %s\n", id,name );
}
cJSON_Delete(root);
free(buffer);
return 0;
}
```
#### 使用 Qt 进行复杂嵌套 JSON 处理
在Qt框架下,能够更加便捷地实现多层嵌套结构下的JSON解析与构造工作。下面给出一段基于Qt环境的例子来展示这一点[^2] :
```cpp
// 导入库
#include <QCoreApplication>
#include <QDebug>
#include <QJsonObject>
#include <QJsonArray>
QString buildNestedJson(){
QJsonObject rootObj;
// 设置顶层字段
rootObj["status"] = QString("success");
rootObj["code"] = QVariant::fromValue<int>(200);
// 插入内含多个元素的对象作为"data"成员
QJsonObject dataObj;
dataObj["id"] = QVariant::fromValue<int>(1);
dataObj["name"] = QString("example");
rootObj["data"] = dataObj;
// 将最终的结果转换为可传输的形式
QJsonDocument doc(rootObj);
return doc.toJson(QJsonDocument::Compact);
}
bool readNestedJson(QString jsonString){
bool ok=false;
QJsonParseError error;
QJsonDocument document = QJsonDocument::fromJson(jsonString.toUtf8(),&error);
if(error.error != QJsonParseError::NoError || !document.isObject()){
qDebug()<<"Failed to parse JSON";
return false;
}
QJsonObject jsonObject=document.object();
// 获取状态信息
QString status=jsonObject.value("status").toString();
qDebug()<<tr("Status:")<<status;
// 获取返回码
int code=jsonObject.value("code").toInt(&ok);
if(ok){
qDebug()<<tr("Code:")<<code;
}
// 获取内部数据项
QJsonValue ref_data=jsonObject.value("data");
if(ref_data.type()==QJsonValue::Object){
QJsonObject obj_data=ref_data.toObject();
int id=obj_data.value("id").toInt(&ok);
if(ok){
qDebug()<<tr("ID:")<<id;
}
QString name=obj_data.value("name").toString();
qDebug()<<tr("Name:")<<name;
}
return true;
}
```
阅读全文
相关推荐











