我真的很喜欢mORMot / Synopse实现JSON处理的方式,特别是你可以在你的代码中使用JSON元素的方式(比如MyString := myjson.name)。这在包装只有一个变量(JSON)的对象时是非常直观和有用的,我们可以通过getters/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文档中找不到元素,我希望得到'default‘变量值(所以,如果'name’不存在,上面的例子应该返回一个空字符串)。
我不想使用NullStrictConvert,因为它不是线程安全的,并且会影响我们程序的其余部分。当然,我可以检查VarIsNull(FState.name),但是我必须对每个元素都这样做,我不希望有这个额外的样板。
有什么建议吗?
发布于 2020-08-19 22:36:23
当您将一些JSON反序列化为对象时,缺少的字段将保持IIRC不变。
因此,您可以在取消序列化JSON之前将字段设置为其默认值。
一种方法是继承TSynPersistent,覆盖Create构造函数并设置默认值。
编辑:您可以使用TDocVariantData而不是variant,如果该属性不存在,则调用GetAsRawUTF8()等返回false的方法。
https://stackoverflow.com/questions/63488604
复制相似问题