C++操作JSON数组Screens无法写入新值问题咨询
问题核心原因
你现有代码的核心错误是多次重复解析JSON生成独立副本,你操作的Ekranlar是和原JSON文件结构完全脱离的新对象,修改自然不会同步到原数据,也没法写入文件。此外你还存在TJSONArray强制转TJSONObject*的类型错误。
正确实现步骤
1. 读取JSON并直接获取Screens数组指针(不要重复Parse)
#include <System.JSON.hpp> #include <System.Classes.hpp> // 读取文件内容 std::unique_ptr<TStringStream> FileContent(new TStringStream); FileContent->LoadFromFile(TOUCHGFXREADER_Params.ProjectFullPath); // 只解析一次根JSON对象 TJSONObject* tgfxFile = dynamic_cast<TJSONObject*>(TJSONObject::ParseJSONValue(FileContent->DataString)); if (!tgfxFile) { // 解析错误处理逻辑 return; } // 直接获取Application对象,不要ToString后再Parse TJSONObject* Application = dynamic_cast<TJSONObject*>(tgfxFile->GetValue("Application")); if (!Application) { delete tgfxFile; return; } // 直接获取Screens数组指针,和原JSON结构绑定 TJSONArray* Ekranlar = dynamic_cast<TJSONArray*>(Application->GetValue("Screens")); if (!Ekranlar) { delete tgfxFile; return; }
2. 向Screens数组添加新元素
根据你要添加的元素类型选择对应方法,示例如下:
// 示例1:添加字符串元素 Ekranlar->Add("NewScreenName"); // 示例2:添加JSON对象元素 TJSONObject* newScreen = new TJSONObject(); newScreen->AddPair("name", "NewScreen"); newScreen->AddPair("id", 1001); Ekranlar->Add(newScreen);
3. 将修改后的JSON写回原文件
std::unique_ptr<TStringStream> outputStream(new TStringStream); outputStream->WriteString(tgfxFile->ToString()); outputStream->SaveToFile(TOUCHGFXREADER_Params.ProjectFullPath); // 最后释放根JSON对象内存 delete tgfxFile;
关键注意点
- 全程只需要解析一次根JSON对象,所有子元素直接从父节点获取,不要调用
ToString()后再次解析 - 用
dynamic_cast做类型转换避免硬转导致的内存错误 - 所有通过
Add方法添加到JSON结构里的对象不需要手动释放,根对象释放时会自动回收子元素内存
内容的提问来源于stack exchange,提问作者ezgi
相关产品推荐
相关产品推荐

