首頁  >  文章  >  後端開發  >  C++中的JSON處理方法及實現

C++中的JSON處理方法及實現

王林
王林原創
2023-08-21 23:58:432405瀏覽

JSON是一種輕量級資料交換格式,易於閱讀和編寫,也易於機器解析和產生。使用JSON格式可以方便地在各個系統之間傳遞資料。在C 中,有許多開源的JSON函式庫可以進行JSON的處理。本文將介紹一些常用的C 中的JSON處理方法及實作。

C 中的JSON處理方法

  1. RapidJSON

RapidJSON是一個快速的C JSON解析器/產生器,提供DOM、SAX和內存池樣式API。它主要的特點有以下幾點:

  • 記憶體佔用小,執行速度快;
  • #支援UTF-8、UTF-16、UTF-32等多種編碼格式;
  • 支援C 11的move sematics,使記憶體管理更有效率;
  • 支援SAX風格的API,能夠對大型JSON檔案進行高效解析;
  • 支援自訂分配策略(allocator)。

RapidJSON中,JSON物件可以透過DOM和SAX方式解析,其中DOM方式可以透過Value類別來實現。以下是一個使用RapidJSON產生並解析JSON的範例程式碼:

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>

using namespace rapidjson;
using namespace std;

int main() {
    // 生成JSON
    StringBuffer s;
    Writer<StringBuffer> writer(s);
    writer.StartObject();
    writer.Key("name");
    writer.String("Tom");
    writer.Key("age");
    writer.Int(20);
    writer.EndObject();

    // 解析JSON
    Document d;
    d.Parse(s.GetString());
    cout << "name: " << d["name"].GetString() << endl;
    cout << "age: " << d["age"].GetInt() << endl;

    return 0;
}
  1. Boost.PropertyTree

Boost.PropertyTree是一個簡單易用的屬性處理函式庫,能夠處理各種屬性格式。其中,它也支援解析和生成JSON。 Boost.PropertyTree比RapidJSON略慢,但也有一些特點:

    ##支援多種資料格式,包括INI檔案、XML和JSON等;
  • 支援C 標準函式庫和BOOST函式庫中的資料類型;
  • 具有可插拔的資料格式處理能力,使用者可以編寫自己的擴充格式。
以下是使用Boost.PropertyTree產生並解析JSON的範例程式碼:

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using namespace std;
using boost::property_tree::ptree;
using boost::property_tree::read_json;
using boost::property_tree::write_json;

int main() {
    // 生成JSON
    ptree pt;
    pt.put("name", "Tom");
    pt.put("age", 20);

    // 解析JSON
    string json_str;
    write_json(cout, pt);
    cout << endl;

    read_json("test.json", pt);
    cout << "name: " << pt.get<string>("name") << endl;
    cout << "age: " << pt.get<int>("age") << endl;

    return 0;
}

    JsonCpp
JsonCpp是一個C 的JSON函式庫,支援行為準則API和DOM風格API。其中,JsonCpp的DOM API類似RapidJSON的Value類別。 JsonCpp的特點有以下幾點:

    支援UTF-8編碼;
  • #支援JSON的解析與產生;
  • 提供物件導向封裝的API;
  • 支援C 11的move sematics。
以下是使用JsonCpp產生並解析JSON的範例程式碼:

#include <iostream>
#include <json/json.h>

using namespace std;
using namespace Json;

int main() {
    // 生成JSON
    Value root;
    root["name"] = "Tom";
    root["age"] = 20;
    string json_str = root.toStyledString();
    cout << json_str << endl;

    // 解析JSON
    Reader reader;
    Value value;
    reader.parse("{"name":"Tom","age":20}", value, false);
    cout << "name: " << value["name"].asString() << endl;
    cout << "age: " << value["age"].asInt() << endl;

    return 0;
}

    Nlohmann.Json
Nlohmann.Json是現代的,輕量級,易於使用的JSON處理庫。它提供了物件導向的API,並支援C 11和以上的標準。 Nlohmann.Json的特點有以下幾點:

    單一檔案頭實現,使用方便;
  • 支援多種STL容器;
  • 非常輕量級, headers only;
  • 格式化輸出非常友善。
以下是使用Nlohmann.Json產生並解析JSON的範例程式碼:

#include <iostream>
#include <nlohmann/json.hpp>

using namespace std;
using json = nlohmann::json;

int main() {
    // 生成JSON
    json j;
    j["name"] = "Tom";
    j["age"] = 20;
    string json_str = j.dump();
    cout << json_str << endl;

    // 解析JSON
    json j2 = json::parse("{"name":"Tom","age":20}");
    cout << "name: " << j2["name"] << endl;
    cout << "age: " << j2["age"] << endl;

    return 0;
}

C 中的JSON處理實作

以上介紹了四種常用的C中JSON處理庫,下面我們來看看具體實作。

    RapidJSON實作
首先需要在專案中引入RapidJSON函式庫,然後就可以使用DOM API來進行JSON的解析與產生。 DOM方式是將整個JSON物件讀入內存,並儲存在一個Value類別中。

產生JSON:

// 生成JSON
Value root(kObjectType);
Value person(kObjectType);
person.AddMember("name", "Tom", allocator);
person.AddMember("age", 20, allocator);
root.AddMember("person", person, allocator);

StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
root.Accept(writer);
cout << buffer.GetString() << endl;

解析JSON:

// 解析JSON
Document d;
d.Parse("{"person":{"name":"Tom","age":20}}");
const Value& person = d["person"];
const string name = person["name"].GetString();
const int age = person["age"].GetInt();

    Boost.PropertyTree實作
使用Boost.PropertyTree需要在專案中引入boost函式庫,然後就可以使用ptree類別來解析和產生JSON。 ptree是一種樹狀結構,讀入JSON後,可以透過ptree的get函數來取得對應的值。

產生JSON:

// 生成JSON
ptree root;
ptree person;
person.put("name", "Tom");
person.put("age", 20);
root.add_child("person", person);

stringstream stream;
write_json(stream, root);
cout << stream.str() << endl;

解析JSON:

// 解析JSON
ptree root;
read_json("test.json", root);
const string name = root.get<string>("person.name");
const int age = root.get<int>("person.age");

    JsonCpp實作
使用JsonCpp需要在專案中引入JsonCpp函式庫,然後就可以使用Value類別來進行JSON的解析和產生。 JsonCpp的Value類別支援多種類型的值,如字串、數字、布林等。

產生JSON:

// 生成JSON
Value root;
Value person;
person["name"] = "Tom";
person["age"] = 20;
root["person"] = person;

cout << root.toStyledString() << endl;

解析JSON:

// 解析JSON
Reader reader;
Value value;
string json_str = "{"person":{"name":"Tom","age":20}}";
reader.parse(json_str, value);
const string name = value["person"]["name"].asString();
const int age = value["person"]["age"].asInt();

    Nlohmann.Json實作
使用Nlohmann.Json需要將json. hpp檔案引入到專案中,然後就可以使用json物件進行JSON的解析和產生。 Nlohmann.Json提供了各種STL容器類型的轉換。

產生JSON:

// 生成JSON
json j;
j["person"]["name"] = "Tom";
j["person"]["age"] = 20;

cout << j.dump() << endl;

解析JSON:

// 解析JSON
json j2 = json::parse("{"person":{"name":"Tom","age":20}}");
const string name = j2["person"]["name"];
const int age = j2["person"]["age"];

總結

本文介紹了C 中四種常用的JSON處理函式庫:RapidJSON、Boost. PropertyTree、JsonCpp和Nlohmann.Json,以及它們的一些特點和實作方法。透過使用這些開源函式庫,可以方便地進行JSON的封裝解析和產生。在實際使用中,開發人員應該選擇最適合自己專案需求的JSON函式庫,以獲得最佳的使用效果。

以上是C++中的JSON處理方法及實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn