如何将JSValue转换为Delphi中的Boolean类型?
Delphi中JSValue转Boolean类型的正确方法
你遇到的问题是因为JS.Properties['loginSuccess']返回的JSValue是变体兼容类型,无法直接赋值给Delphi的Boolean变量,也不能直接调用.AsBoolean方法。以下是几种可行的解决办法:
方法1:强制类型转换
适用于确定返回值确实为布尔类型的场景,直接将JSValue强制转换为Boolean:
LoginAPI.Execute( procedure(AResponse: string; AReq: TJSXMLHttpRequest) var JS: TJSObject; loginSuccess: Boolean; begin JS := TJSJSON.parseObject(AResponse); loginSuccess := Boolean(JS.Properties['loginSuccess']); console.log(loginSuccess); end );
方法2:转换为TJSValue后调用AsBoolean
先将JSValue转换为TJSValue对象,再调用其AsBoolean属性,逻辑更严谨:
LoginAPI.Execute( procedure(AResponse: string; AReq: TJSXMLHttpRequest) var JS: TJSObject; loginSuccess: Boolean; JsVal: TJSValue; begin JS := TJSJSON.parseObject(AResponse); JsVal := TJSValue(JS.Properties['loginSuccess']); loginSuccess := JsVal.AsBoolean; console.log(loginSuccess); end );
方法3:类型判断后安全转换
如果不确定返回值类型,可先判断类型再转换,避免类型不匹配报错:
LoginAPI.Execute( procedure(AResponse: string; AReq: TJSXMLHttpRequest) var JS: TJSObject; loginSuccess: Boolean; Val: JSValue; begin JS := TJSJSON.parseObject(AResponse); Val := JS.Properties['loginSuccess']; if Val is TJSBoolean then loginSuccess := TJSBoolean(Val).Value else loginSuccess := False; // 非布尔类型时设置默认值 console.log(loginSuccess); end );
方法4:使用TJSUtility工具类
借助Delphi提供的TJSUtility类简化转换操作:
LoginAPI.Execute( procedure(AResponse: string; AReq: TJSXMLHttpRequest) var JS: TJSObject; loginSuccess: Boolean; begin JS := TJSJSON.parseObject(AResponse); loginSuccess := TJSUtility.ToBoolean(JS.Properties['loginSuccess']); console.log(loginSuccess); end );
内容的提问来源于stack exchange,提问作者Shaun Roselt
相关产品推荐
相关产品推荐

