一 概念
json是一種輕量級,基于文本的,可讀的數據交換格式,能夠讓數據在不同系統(比如前端—后端,服務器—客戶端)間方便傳遞/存儲。在編程語言中都內置了處理json數據的方法
二 語法規則
1. 數據格式(鍵值對+結構化)
編譯時后面要加-ljsoncpp
{"name": "小王", // 字符串值"tel": "13500000000",// 字符串值 "age": 20, // 數字值"is_vip": true, // 布爾值"hobbies": ["籃球", "音樂"], // 數組"info": { // 嵌套對象"city": "北京" }
}
核心規則:
用{}表示對象(鍵值對集合),【】表示數組
鍵key必須是字符串(用雙引號包裹)
值value可以是字符串,數字,布爾值,數組,null等
不同鍵值對用,分隔。最后一個不加
2. 和編程語言的映射
JSon::Value val; 在json這個名字空間中,value這個類的對象是val。這個里面存name/tel等
#include <iostream>
#include <string.h>
#include <string>
#include <jsoncpp/json/json.h>using namespace std;
int main()
{Json::Value val;val["name"] = "小王";//給json對象加鍵值對 name——小王val["tel"] = "13500000000";char buff[128] = {0};strcpy(buff, val.toStyledString().c_str());cout << buff << endl;Json::Value res;//用來存反序列化后的結果Json::Reader Read;//反序列化工具Read.parse(buff, res);//把buff中的JSON字符串轉成JSon::Valuecout << res["name"].asString() << endl;cout << res["tel"].asString() << endl;
}
三 使用JsonCpp庫操作JSON
流程:構建JSONM——序列化為字符串——反序列化為JSON——提取數據
1. 構建json對象(Json::Value val)
2. 序列化為字符串(val.toStyledString())
把內存里的?Json::Value數據對象(結構化數據),轉成 人類可讀的JSON字符串,方便存儲 / 傳輸。返回std::string類型
?toStyledString
(格式化序列化,輸出帶縮進換行,更美觀)、toString
(緊湊序列化,無多余空白)
-
c_str()
?的作用:val.toStyledString().c_str()
?返回?const char*
,指向?std::string
?內部的以?'\0'
?結尾的字符數組。
-
strcpy
?的類型匹配:strcpy
?的原型為?char* strcpy(char* dest, const char* src)
。buff
?的類型是?char[128]
,在函數調用時?隱式轉換為?char*
(指向數組首元素的指針)。- 風險:若 JSON 字符串長度超過 127 字節,會導致?緩沖區溢出。
3. 反序列化為JSON
Json::Reader Read;:創建一個解析器對象,像一個翻譯器,負責把文本形式的JSON轉化為程序能操作的結構化數據
線程安全:Json::Reader?實例?非線程安全,若在多線程環境中使用,需為每個線程單獨創建。
生命周期:通常只需在解析 JSON 前創建,解析完成后可銷毀(作用域結束自動釋放)。
為什么要反序列化:因為傳輸 / 存儲時只能用字符串,但程序要操作數據,必須轉回結構化對象。
Read.parse(...):執行解析操作,將?JSON 字符串(存儲在?buff?中)解析為?Json::Value 對象(存儲在?res?中),便于后續程序訪問 JSON 中的字段。
res:
類型:Json::Value&(引用)。
含義:解析結果將存入此對象。
示例:解析后可通過?res["name"]?訪問?"小王"。
為什么res是引用?
Json::Reader::parse
?的目的是把輸入的 JSON 字符串解析成?Json::Value
?類型的結構化數據。函數需要將解析后的結果 “輸出” 給調用者,引用是實現這種 “輸出” 的高效方式:如果不用引用,而是按值傳遞(Json::Value res
),函數內部對?res
?的修改無法傳遞到函數外部,調用者拿不到解析后的結果,無法實現 “將 JSON 字符串解析為可用對象” 的核心需求。
通過引用傳遞(Json::Value&
),函數直接操作調用者提供的?res
?對象,無需拷貝,效率更高,尤其是在處理大型 JSON 數據時,這種性能優勢更明顯。
4. 按鍵提取json數據并轉化為字符串
?res["name"].asString():
從?Json::Value?對象中,按?鍵(Key)?提取對應的值,并將其轉換為 C++ 的?std::string?類型。