1. 优化了cpp_json的内容,使其更modern

2. 稍微优化了一下系统配置类
3. 增加了系统版本号,便于区分系统版本,方便OTA
4. 重写OTA的逻辑,完成了Cpp的OTA封装,测试通过
This commit is contained in:
Misaki
2025-09-24 04:01:23 +08:00
parent 6c4749ba0c
commit a47e20cb64
18 changed files with 908 additions and 458 deletions
+34 -28
View File
@@ -9,27 +9,27 @@
*/
/**
* 如何使用:
std::string text = R"({"name":"Misaki","age":18,"skills":["C++","RISC-V"]})";
auto j = cppjson::Json::parse(text);
std::cout << "name = " << j["name"].asString() << '\n';
j["skills"].append(cppjson::Json("Go"));
std::cout << j.dumpPretty() << '\n';
* 如何使用:\n
std::string text = R"({"name":"Misaki","age":18,"skills":["C++","RISC-V"]})"; \n
auto j = cppjson::Json::parse(text);\n
std::cout << "name = " << j["name"].asString() << '\n';\n
j["skills"].append(cppjson::Json("Go"));\n
std::cout << j.dumpPretty() << '\n';\n
or:
Json j = Json::object();
j.set("name", Json("misaki"))
.set("age", Json(24))
.set("vip", Json(true))
.set("list", Json::array()
.append(Json(1))
.append(Json("hello")));
or:\n
Json j = Json::object();\n
j.set("name", Json("misaki"))\n
.set("age", Json(24))\n
.set("vip", Json(true))\n
.set("list", Json::array()\n
.append(Json(1))\n
.append(Json("hello")));\n
std::cout << j.dumpPretty() << "\n";
std::cout << j.dumpPretty() << "\n";\n
Json j2 = j["list"];
for (auto& v : j2) std::cout << v.dump() << " ";
std::cout << "\n";
Json j2 = j["list"];\n
for (auto& v : j2) std::cout << v.dump() << " ";\n
std::cout << "\n";\n
*/
// cpp_json.hpp
@@ -53,8 +53,14 @@ class Json {
public:
enum Type { Null, Bool, Number, String, ArrayType, ObjectType };
/*-------- 构造 ------------------------------------------------*/
// 构造
Json() noexcept : ptr_(nullptr), owner_(false) {}
// 支持所有整型(包括 int32_t / uint64_t 等 typedef
template <typename T,
std::enable_if_t<std::is_integral_v<T>, int> = 0>
explicit Json(T v) noexcept
: ptr_(cJSON_CreateNumber(static_cast<double>(v))), owner_(true) {}
explicit Json(std::nullptr_t) noexcept : Json() {}
explicit Json(bool v) : ptr_(cJSON_CreateBool(v)), owner_(true) {}
explicit Json(int v) : ptr_(cJSON_CreateNumber(v)), owner_(true) {}
@@ -63,11 +69,11 @@ public:
explicit Json(const std::string& v):ptr_(cJSON_CreateString(v.c_str())), owner_(true) {}
explicit Json(const Array& arr); // 类外实现
explicit Json(const Object& obj); // 类外实现
/* 接管原始指针,owner=true 会负责 delete */
// 接管原始指针,owner=true 会负责 delete,切记不要接管后再在外部cJSON_Delete
explicit Json(cJSON* raw, bool owner = true) noexcept
: ptr_(raw), owner_(owner) {}
/*-------- 拷贝/移动 -------------------------------------------*/
// 拷贝/移动
Json(const Json& rhs)
: ptr_(rhs.ptr_ ? cJSON_Duplicate(rhs.ptr_, 1) : nullptr), owner_(true) {}
Json(Json&& rhs) noexcept
@@ -75,7 +81,7 @@ public:
Json& operator=(Json rhs) noexcept { swap(rhs); return *this; }
~Json() { reset(); }
/*-------- 工厂 ------------------------------------------------*/
// 工厂
static Json parse(const std::string& text) {
cJSON* p = cJSON_Parse(text.c_str());
if (!p) throw std::runtime_error("cppjson::parse failed");
@@ -84,7 +90,7 @@ public:
static Json array() { return Json(cJSON_CreateArray(), true); }
static Json object() { return Json(cJSON_CreateObject(), true); }
/*-------- 序列化 ----------------------------------------------*/
// 序列化
[[nodiscard]] std::string dump() const {
if (!ptr_) return "null";
char* s = cJSON_PrintUnformatted(ptr_);
@@ -100,7 +106,7 @@ public:
return ret;
}
/*-------- 类型查询 --------------------------------------------*/
// 类型查询
[[nodiscard]] Type type() const noexcept {
if (!ptr_) return Null;
switch (ptr_->type & 0xFF) {
@@ -120,13 +126,13 @@ public:
[[nodiscard]] bool isArray() const noexcept { return type() == ArrayType; }
[[nodiscard]] bool isObject() const noexcept { return type() == ObjectType; }
/*-------- 取值 ------------------------------------------------*/
// 取值
[[nodiscard]] bool asBool() const { if (!isBool()) throw std::runtime_error("not bool"); return cJSON_IsTrue(ptr_); }
[[nodiscard]] int asInt() const { if (!isNumber()) throw std::runtime_error("not number"); return static_cast<int>(ptr_->valueint); }
[[nodiscard]] double asDouble() const { if (!isNumber()) throw std::runtime_error("not number"); return ptr_->valuedouble; }
[[nodiscard]] std::string asString() const { if (!isString()) throw std::runtime_error("not string"); return ptr_->valuestring; }
/*-------- 数组/对象接口 ---------------------------------------*/
// 数组/对象接口
[[nodiscard]] size_t size() const {
if (isArray() || isObject()) return cJSON_GetArraySize(ptr_);
return 0;
@@ -152,7 +158,7 @@ public:
return *this;
}
/*-------- 迭代器(只读)---------------------------------------*/
// 迭代器(只读)
template <bool IsConst>
struct iterator_impl {
using iterator_category = std::forward_iterator_tag;
@@ -194,7 +200,7 @@ private:
};
/*================ 类外实现:Array / Object 构造 =================*/
// 类外实现:Array / Object 构造
inline Json::Json(const Array& arr)
: ptr_(cJSON_CreateArray()), owner_(true) {
for (const auto& v : arr) append(v);