You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:36:03