如何将JSValue转换为布尔值?

问题描述 投票:0回答:2

我正在使用

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

delphi boolean tms tms-web-core
2个回答
-1
投票

根据 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}
,我怀疑是二进制文件而不是源代码。


-2
投票

如果你知道属性的值肯定是

Boolean
,那么你可以直接将其转换为
Boolean
,如下所示:

loginSuccess := Boolean(JS.Properties['loginSuccess']);
© www.soinside.com 2019 - 2024. All rights reserved.