>  기사  >  백엔드 개발  >  JSON 처리 방법 및 C++ 구현

JSON 처리 방법 및 C++ 구현

王林
王林원래의
2023-08-21 23:58:432479검색

JSON은 읽고 쓰기 쉽고 기계가 쉽게 구문 분석하고 생성할 수 있는 경량 데이터 교환 형식입니다. JSON 형식을 사용하면 다양한 시스템 간에 데이터를 쉽게 전송할 수 있습니다. C++에는 JSON 처리를 위한 오픈 소스 JSON 라이브러리가 많이 있습니다. 이 기사에서는 C++에서 일반적으로 사용되는 JSON 처리 방법 및 구현을 소개합니다.

C++의 JSON 처리 방법

  1. RapidJSON

RapidJSON은 DOM, SAX 및 메모리 풀 스타일 API를 제공하는 빠른 C++ JSON 파서/생성기입니다. 주요 기능은 다음과 같습니다:

  • 작은 메모리 공간과 빠른 실행 속도
  • UTF-8, UTF-16, UTF-32 및 기타 인코딩 형식 지원
  • C++11의 이동 의미론 지원, 메모리 생성 보다 효율적으로 관리할 수 있습니다.
  • 대용량 JSON 파일을 효율적으로 구문 분석할 수 있는 SAX 스타일 API를 지원합니다.
  • 사용자 지정 할당 전략(할당자)을 지원합니다.

RapidJSON에서는 DOM과 SAX를 통해 JSON 객체를 파싱할 수 있고, Value 클래스를 통해 DOM 메서드를 구현할 수 있습니다. 다음은 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는 행동 강령 API 및 DOM 스타일 API를 지원하는 C++ JSON 라이브러리입니다. 그 중 JsonCpp의 DOM API는 RapidJSON의 Value 클래스와 유사합니다. JsonCpp의 기능은 다음과 같습니다.

    UTF-8 인코딩을 지원합니다.
  • JSON 구문 분석 및 생성을 지원합니다.
  • 객체 지향 캡슐화된 API를 제공합니다.
  • C++11 이동 의미론을 지원합니다.
다음은 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 컨테이너를 지원합니다.
  • 매우 가볍고, 헤더만 지원됩니다.
  • 다음은 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 구현

  1. 먼저 프로젝트에 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 구현

  1. Boost.PropertyTree를 사용하려면 프로젝트에 부스트 라이브러리를 도입해야 하며, 그런 다음 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 구현

  1. 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 구현

  1. 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"];

Summary

이 문서에서는 C++에서 일반적으로 사용되는 네 가지 JSON 처리 라이브러리인 RapidJSON, Boost.PropertyTree, JsonCpp 및 Nlohmann.Json과 해당 라이브러리의 일부 특성 및 구현을 소개합니다. 방법. 이러한 오픈 소스 라이브러리를 사용하면 JSON 캡슐화 구문 분석 및 생성을 쉽게 수행할 수 있습니다. 실제 사용에서 개발자는 최상의 결과를 얻기 위해 프로젝트 요구 사항에 가장 적합한 JSON 라이브러리를 선택해야 합니다.

위 내용은 JSON 처리 방법 및 C++ 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.