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

使用mORMot框架序列化TObject至JSON始终返回null问题排查

解决mORMot序列化TObject返回null的问题

我来帮你搞定这个序列化返回null的坑!结合你提到的调试情况,大概率是mORMot没能识别你的类结构,导致它认为对象无法序列化而返回null。下面是几个最常见的原因和对应的解决办法:

1. 你的类没有注册序列化元信息

mORMot需要提前知道类的结构才能正确序列化对象,所以必须调用RegisterSerializable方法注册你的类。这是新手最容易忽略的核心步骤!

示例代码:

uses SynCommons;

type
  // 假设你的目标类是这样的
  TUser = class(TObject)
  public
    Username: string;
    Email: string;
    Age: Integer;
  end;

// 必须在初始化部分注册类,让mORMot识别它的结构
initialization
  RegisterSerializable(TUser);
end.

2. 类的成员没有被标记为可序列化

如果你的类成员是private/protected权限,又没有用published修饰,mORMot默认会忽略这些成员;或者你也可以用mORMot的自定义注解来明确指定要序列化的字段。

方案A:用published修饰成员

最简单的方式就是把需要序列化的成员放到published段:

type
  TUser = class(TObject)
  published // 改成published后,mORMot会自动识别这些成员
    Username: string;
    Email: string;
    Age: Integer;
  end;

方案B:用mORMot注解标记

如果不想修改成员权限,可以用[JSONName]注解明确指定要序列化的字段:

type
  TUser = class(TObject)
  public
    [JSONName('username')]
    Username: string;
    [JSONName('email')]
    Email: string;
    [JSONName('age')]
    Age: Integer;
  end;

3. 确认序列化方法的调用正确

确保你用的是mORMot提供的正确序列化方法,比如JSONSerialize或者标准的TTextWriter用法:

var
  UserObj: TUser;
  ResultJSON: string;
begin
  UserObj := TUser.Create;
  try
    UserObj.Username := 'BigONotation';
    UserObj.Email := 'test@example.com';
    UserObj.Age := 28;
    // 正确的序列化调用
    ResultJSON := JSONSerialize(UserObj);
    // 此时ResultJSON应该是你预期的格式:{"Username":"BigONotation","Email":"test@example.com","Age":28}
  finally
    UserObj.Free;
  end;
end;

你调试时发现TTextWriter.WriteObject里的代码导致返回null,本质上就是因为以上某个原因,使得mORMot无法获取到类的序列化元信息,从而判定对象无法序列化,最终输出null。

按照上面的步骤调整后,应该就能得到你预期的JSON格式啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:55:20