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();
}
}

浙公网安备 33010602011771号