1

我真的很喜欢 mORMot / Synopse 实现 JSON 处理的方式,尤其是您可以在代码中使用 JSON 元素的方式(如MyString := myjson.name)。这在包装只有一个变体(JSON)的对象时非常直观和有用,我们通过 getter/setter 访问状态,如下所示:

  TMyObject = class
  private
    FState: Variant;

    function GetName: String;
  public
    constructor Create(AJson: Variant);

    property Name: String read GetName;
  end;

  function TMyObject.GetName: String;
  begin
    Result := FState.name;
  end;

它真的很强大,但是如果在相应的 JSON 文档中找不到元素,我想获取“默认”变体值(因此,如果“名称”不存在,上面的示例应该返回一个空字符串)。

我不想使用NullStrictConvert,因为这不是线程安全的并且会影响我们程序的其余部分。当然我可以检查VarIsNull(FState.name),但是我必须对每个元素都这样做,而且我不希望有这个额外的样板。

有什么建议么?

4

1 回答 1

2

当您将一些 JSON 反序列化为对象时,缺少的字段将保持不变 IIRC。

因此,您可以在反序列化 JSON 之前将字段设置为其默认值。

一种方法是继承TSynPersistent并覆盖Create构造函数并设置默认值。

编辑:您可以使用 aTDocVariantData而不是variant, 并调用和如果属性不存在则GetAsRawUTF8()返回的此类方法。false

于 2020-08-19T14:36:22.787 回答