C++ 解析 json

C++ 解析 json

C++ 解析 json 可以使用
nlohmann/json

安装

sudo apt show nlohmann-json3-dev
sudo apt install nlohmann-json3-dev

配置cmake

cmake_minimum_required(VERSION 3.10.0)
project(json_learn01 VERSION 0.1.0 LANGUAGES C CXX)

# ✅ 设置 C++ 标准
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # 强制使用指定标准
set(CMAKE_CXX_EXTENSIONS OFF)        # 禁用编译器扩展(使用纯标准)

# 查找源文件
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS
    "src/*.cpp"
    "src/*.c"
)

add_executable(json_learn01 main.cpp ${SOURCES})

target_include_directories(${CMAKE_PROJECT_NAME}
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/learn01
)

find_package(nlohmann_json REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE nlohmann_json::nlohmann_json)

include(CTest)
enable_testing()

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

解析 json

头文件

#ifndef LEARN001_HPP
#define LEARN001_HPP 

#include <iostream>
#include <fstream>
#include <string>
#include <nlohmann/json.hpp>
#include <format>

using json = nlohmann::json;

namespace learn01{
    void hello();
    void parseJsonToPerson();
    void personToJson();
}

#endif // LEARN001_HPP

源文件

#include "learn001.hpp"

struct Person{
    Person() = default;
    Person(const std::string name, const int age, const std::string sex, const double weight) : name(name), age(age), sex(sex), weight(weight){
        std::cout << "Person construct...\n";
    }
    std::string name;
    int age;
    std::string sex;
    double weight;
    friend std::ostream& operator<<(std::ostream& os, const Person& person){
        os << std::format("Person(name={}, age={}, sex={}, weight={})", person.name, person.age, person.sex, person.weight);
        return os;
    }
};
void from_json(const json &j, Person &p){
    j.at("name").get_to(p.name);
    j.at("age").get_to(p.age);
    j.at("sex").get_to(p.sex);
    j.at("weight").get_to(p.weight);
}
void to_json(json& j, const Person &p){
    j = json {
        {"name", p.name},
        {"age", p.age},
        {"sex", p.sex},
        {"weight", p.weight},
    };
}
namespace learn01{
    void hello(){
        std::cout << "Hello World\n";
    }
    void parseJsonToPerson(){
        std::ifstream jsonFile("../hello.json");
        if (!jsonFile.is_open()){
            std::cerr << "无法打开hello.json文件\n";
            return;
        }
        json j;
        jsonFile >> j;
        jsonFile.close();
        Person p = j.get<Person>();
        std::cout << p << "\n";
    }
    void personToJson(){
        Person p("zsh", 18, "猛男", 188.0);
        std::cout << p << "\n";
        json j = p;
        std::cout << j.dump(4) << "\n";
        std::ofstream jsonFile("../out.json");
        if(!jsonFile.is_open()){
            std::cerr << "文件打开失败...\n";
            return;
        }
        jsonFile << j.dump(4);
        jsonFile.close();
    }
}
posted @ 2025-11-08 15:42  爱情丶眨眼而去  阅读(6)  评论(0)    收藏  举报