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

C++中TJson::ObjectToJsonString转换对象为JSON字符串失败问题

解决C++Builder中TJson::ObjectToJsonString无法序列化自定义TObject子类的问题

我之前也踩过这个坑!在CBuilder里用TJson::ObjectToJsonString处理自定义TObject子类时,确实会出现和Delphi不一致的情况,核心原因是**CBuilder对RTTI(运行时类型信息)的配置要求更严格**,下面是具体的解决步骤:

1. 把属性移到__published段

Delphi中published属性会自动生成RTTI供序列化使用,但C++Builder里必须明确使用__published关键字来标记需要序列化的属性——public段的属性默认不会被RTTI识别,自然无法被TJson序列化。

修改你的TData类定义:

class TData : public TObject { 
private: 
    String FName; 
__published: // 关键:用__published替代public
    __property String Name = {read=FName, write=FName}; 
public: 
    // 这里放公共方法(如果有的话)
};

2. 确保项目启用RTTI生成

即使标记了__published,如果项目没有开启RTTI生成,编译器还是不会为类生成必要的类型信息。在C++Builder中:

  • 打开项目选项(Project > Options)
  • 导航到C++ Compiler > RTTI
  • 勾选Generate RTTI,或者至少确保包含TData类的单元被设置为生成RTTI

3. 完整测试示例

下面是可以直接运行的完整代码,验证序列化是否正常:

#include <System.Json.hpp>
#include <System.SysUtils.hpp>
#include <Vcl.Dialogs.hpp>

class TData : public TObject { 
private: 
    String FName; 
__published: 
    __property String Name = {read=FName, write=FName}; 
public: 
    __fastcall TData() : TObject() {} // 显式构造函数(可选,但推荐)
};

void TestJsonSerialization() {
    TData* data = new TData();
    try {
        data->Name = "Mathew Joy";
        String jsonResult = TJson::ObjectToJsonString(data);
        ShowMessage(jsonResult); // 应该输出:{"Name":"Mathew Joy"}
    } __finally {
        delete data; // 记得释放内存
    }
}

为什么Delphi里能正常运行?

Delphi编译器默认会为published属性自动生成RTTI,甚至在某些配置下public属性也会生成RTTI;但C++Builder为了编译效率,默认只对__published属性生成RTTI,且需要手动开启项目的RTTI生成开关,这就是两者行为差异的根源。

如果你的类还有其他类型的属性(比如整数、日期、嵌套的TObject子类),只要把它们放到__published段,并且确保类型本身支持RTTI序列化,就能正常被转换为JSON。

内容的提问来源于stack exchange,提问作者Mathew Joy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:05:11