Delphi XE4使用TSuperObject实现JSON转自定义类对象的方法咨询
实现方案
TSuperObject的TSuperRttiContext提供了与AsJson<T>对应的AsType<T>泛型方法,可直接实现JSON字符串到对象的反序列化,具体实现步骤如下:
1. 补充类的无参构造函数
TSuperObject通过RTTI创建类实例时默认调用无参构造函数,你需要先给两个类补充无参构造,避免反序列化报错:
TAspTransactionBasicData = Class(TObject) Currency : Byte; Amount : Currency; // 新增无参构造,和原有带参构造成重载关系 constructor Create; overload; constructor Create(aCurrency: Byte; aAmount: Currency); overload; end; TStartWorkflowWithBasicData = Class(TObject) AdditionalData : TAspTransactionBasicData; TypeOfWorkflow : Byte; // 新增无参构造,和原有带参构造成重载关系 constructor Create; overload; constructor Create(aAdditionalData: TAspTransactionBasicData; aTypeOfWorkflow: Byte); overload; function toJSon(AObject:TStartWorkflowWithBasicData):String; // 新增反序列化类方法,入参为JSON字符串,返回目标对象实例 class function fromJson(const jsonStr: String): TStartWorkflowWithBasicData; end; // 无参构造实现示例 constructor TAspTransactionBasicData.Create; begin inherited Create; end; constructor TStartWorkflowWithBasicData.Create; begin inherited Create; end;
2. 实现fromJson方法
class function TStartWorkflowWithBasicData.fromJson(const jsonStr: String): TStartWorkflowWithBasicData; var RttiCont: TSuperRttiContext; jsonObj: ISuperObject; begin Result := nil; RttiCont := TSuperRttiContext.Create; try // 将JSON字符串解析为ISuperObject对象 jsonObj := TSuperObject.ParseString(PChar(jsonStr), False); if not Assigned(jsonObj) then Exit; // 调用AsType泛型方法完成反序列化 Result := RttiCont.AsType<TStartWorkflowWithBasicData>(jsonObj); finally RttiCont.Free; end; end;
3. 调用示例及内存管理说明
反序列化生成的类实例完全由程序控制生命周期,使用完需要手动释放避免内存泄漏:
var workflowObj: TStartWorkflowWithBasicData; begin workflowObj := TStartWorkflowWithBasicData.fromJson('待反序列化的JSON字符串'); try // 此处编写业务逻辑代码 finally // 先释放内部嵌套的TAspTransactionBasicData实例,再释放外层对象 workflowObj.AdditionalData.Free; workflowObj.Free; end; end;
内容的提问来源于stack exchange,提问作者John Sebik Hook
相关产品推荐
相关产品推荐

