#include "CFDStructDataManagerBase.h" CFDStructDataManagerBase::CFDStructDataManagerBase(QObject *parent) : QObject(parent) { m_cuiSigsCenter = CUISigsCenter::getInstance(); } CFDStructDataManagerBase::~CFDStructDataManagerBase() { if (m_uiConfig != nullptr) { delete m_uiConfig; m_uiConfig = nullptr; } } CUIConfig *CFDStructDataManagerBase::getParamUIConfig() { return nullptr; } void CFDStructDataManagerBase::saveDataToDom(rapidjson::Document &dom) {} // 写入json void CFDStructDataManagerBase::jsonAdd(rapidjson::Document &document, QVariant value, QVector path) { using namespace rapidjson; // 获取分配器 Document::AllocatorType &allocator = document.GetAllocator(); // 递归地创建路径中的对象 Value *current = &document; for (int i = 0; i < path.size(); ++i) { // const std::string& key = path[i]; QVariant key = path.at(i); // 如果到了最后一层路径,设置值 if (i == path.size() - 1) { if (key.type() == QVariant::String) { // 如果是路径 // 检查路径末尾是否存在 if (!current->IsObject()) current->SetObject(); if (current->HasMember(key.toString().toStdString().c_str())) { if (value.type() == QVariant::Int) (*current)[key.toString().toStdString().c_str()].SetInt(value.toInt()); // 如果存在则替换 if (value.type() == QVariant::Double) (*current)[key.toString().toStdString().c_str()].SetDouble( value.toDouble()); // 如果存在则替换 if (value.type() == QVariant::String) (*current)[key.toString().toStdString().c_str()].SetString( value.toString().toStdString().c_str(), allocator); // 如果存在则替换 } else { if (value.type() == QVariant::Int) (*current).AddMember( Value().SetString(key.toString().toStdString().c_str(), allocator), Value().SetInt(value.toInt()), allocator); // 不存在则添加 if (value.type() == QVariant::Double) (*current).AddMember( Value().SetString(key.toString().toStdString().c_str(), allocator), Value().SetDouble(value.toDouble()), allocator); // 不存在则添加 if (value.type() == QVariant::String) (*current).AddMember( Value().SetString(key.toString().toStdString().c_str(), allocator), Value().SetString(value.toString().toStdString().c_str(), allocator), allocator); // 不存在则添加 } } else if (key.type() == QVariant::Int) { // 如果是数组idx int index = key.toInt(); if (!current->IsArray()) { current->SetArray(); } if (index == -1) { } else { // 扩展数组以适应指定索引 while (current->Size() <= index) { rapidjson::Value object(rapidjson::kObjectType); current->PushBack(object, allocator); } // 设置值 if (value.type() == QVariant::Int) { (*current)[index].SetInt(value.toInt()); } else if (value.type() == QVariant::Double) { (*current)[index].SetDouble(value.toDouble()); } else if (value.type() == QVariant::String) { (*current)[index].SetString(value.toString().toStdString().c_str(), allocator); } else if (value.type() == QVariant::Bool) { (*current)[index].SetBool(value.toBool()); } else if (value.type() == QVariant::StringList) { Value jsonArray(kArrayType); for (const QString &str : value.toStringList()) { Value strVal; strVal.SetString(str.toStdString().c_str(), allocator); jsonArray.PushBack(strVal, allocator); } (*current)[index] = jsonArray; } } } } else { if (key.type() == QVariant::String) { // 如果是路径 // 检查是否存在该路径,不存在则创建 if (!current->IsObject()) current->SetObject(); if (!current->HasMember(key.toString().toStdString().c_str())) { Value newObject(kObjectType); // 创建一个新的对象 current->AddMember( Value().SetString(key.toString().toStdString().c_str(), allocator), newObject, allocator); } // 将 current 指向下一级 current = &(*current)[key.toString().toStdString().c_str()]; } else if (key.type() == QVariant::Int) { // 如果是数组idx int index = key.toInt(); if (!current->IsArray()) { current->SetArray(); } while (current->Size() <= index) { rapidjson::Value object(rapidjson::kObjectType); (*current).PushBack(object, allocator); } current = &(*current)[index]; } } } } #include #include void CFDStructDataManagerBase::jsonRead(rapidjson::Document &document, QVariant &value, QVector path) { using namespace rapidjson; Value *current = &document; for (const QVariant &p : path) { if (p.type() == QVariant::String) { // 如果路径组件是字符串 // const QString key = p.toString(); std::string key = p.toString().toStdString(); if (current->IsObject() && current->HasMember(key.c_str())) { current = &((*current)[key.c_str()]); } else { // 如果键不存在,设置value为无效值或者抛出异常 value = QVariant(); return; } } else if (p.type() == QVariant::Int) { // 如果路径组件是整数 int index = p.toInt(); if (current->IsArray() && index >= 0 && index < current->Size()) { current = &((*current)[index]); } else { // 如果索引超出范围,我们可以设置value为无效值或者抛出异常 value = QVariant(); return; } } else { // 如果路径组件既不是字符串也不是整数,我们可以设置value为无效值或者抛出异常 value = QVariant(); return; } } // 到达路径的末端,将当前值赋给value if (current->IsString()) { value = current->GetString(); } else if (current->IsInt()) { value = current->GetInt(); } else if (current->IsDouble()) { value = current->GetDouble(); } else if (current->IsBool()) { value = current->GetBool(); } else if (current->IsNull()) { value = QVariant(); // 设置为无效值 } }