我正在使用
TWebHttpRequest
进行 API 调用,然后将响应字符串解析为 TJSObject
,但是当我尝试从 TJSObject
获取值时,它会以 JSValue
的形式返回。我需要将这个 JSValue
并将其存储在 Delphi Boolean
变量中。
这是我的代码:
LoginAPI.Execute(
procedure(AResponse: string; AReq: TJSXMLHttpRequest)
var
JS: TJSObject;
loginSuccess: Boolean;
begin
JS := TJSJSON.parseObject(AResponse);
loginSuccess := JS.Properties['loginSuccess'];
console.log(loginSuccess);
end
);
我收到以下错误:
[错误] 不兼容的类型:得到“JSValue”预期为“Boolean”
当我尝试获取值并将其放入
loginSuccess := JS.Properties['loginSuccess']
变量时,此错误发生在 Boolean
上。
当我执行
console.log(JS.Properties['loginSuccess'])
时,我可以看到该值在浏览器控制台中肯定是 Boolean
。所以我只需要知道如何在 Delphi 中将其作为 Boolean
获取。
我尝试做一个
.AsBoolean
,但这不起作用:
loginSuccess := JS.Properties['loginSuccess'].AsBoolean;
然后我得到的错误是:
[错误]非法限定符“.”在“属性:JSValue”之后
那么,如何将这个
JSValue
转换为 Boolean
?
根据 pas2js 的文档,可以通过将其与布尔文字进行比较来强制执行其布尔性:
var
jso: TJSObject;
jsv: JSValue;
b: Boolean;
begin
...
jsv:= jso.Properties['any'];
b:= !(jsv== false); // Value equals Boolean FALSE? Invert whole meaning.
只有当你知道自己在做什么时才应该进行转换 - 但由于 JavaScript 的性质,不能保证任何东西总是会计算为
true
或 false
而没有任何进一步的状态(如 null
或 undefined
) ).
我还没有找到它的实际定义,只有 DefinedClassesWebKit.pas line #168 with:
JSValue = objcclass external;
...这意味着实际定义在其他地方。由于
{$modeswitch}
,我怀疑是二进制文件而不是源代码。
如果你知道属性的值肯定是
Boolean
,那么你可以直接将其转换为Boolean
,如下所示:
loginSuccess := Boolean(JS.Properties['loginSuccess']);