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
相关产品推荐
相关产品推荐

