默认状态下, mORMot的SynCommon.pas单元的JSON反序列化会需要保证JSON中的字段和声明的结构体是一致的 例如,

{"a":1,"b":2}

是不能被反序列化到下面这个结构体的

TTest = record
  a:Integer;
end;

在官方博客有篇帖子提到这样的需求 链接

使用 soReadIgnoreUnknownFields 选项即可让反序列化忽略不存在的字段

TTextWriter.RegisterCustomJSONSerializerFromText(TypeInfo(TTestCustomJSONGitHub),
    __TTestCustomJSONGitHub).Options := [soReadIgnoreUnknownFields,soWriteHumanReadable]
  • soReadIgnoreUnknownFields to ignore any non defined field in the incoming JSON;
  • soWriteHumanReadable to let the output JSON be more readable.

不过一般使用的时候, 对于这种的需求还是很大的, 如果有个JSON, 里面有几十个字段, 而且还疯狂嵌套, 那简直是要疯了

于是, 直接在源码上进行修改, 以永久实现这个功能

SynCommon.pas 文件搜索 TJSONRecordAbstract.Create, 并增加一行

  fItems := TObjectList.Create;
  Options := [soReadIgnoreUnknownFields, soWriteHumanReadable];

这样就可以实现, 默认忽略字段, 并且输出JSON时是可读性更好的已展开的JSON

最后, 为保证这个修改可以一直生效, 可以使用自己的GIT仓库, 把这个修改提交到自己的仓库中. 就像这样

origin/master 对应官方的仓库 origin2/master 对应自己本地的仓库

origin2中包含这个自定义的修改, 以后官方有修改了, 就先拉取一下origin, 然后推送到origin2, 那么以后要用代码了就从origin2克隆一份就行了