使用 VBScript 解析 JSON 文件 - QTP/UFT

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

我正在使用 QTP/UFT 来自动化我的 UI 应用程序。我想将 UI 值与 REST API 响应中的值进行比较。我是 VBScript 新手,我已经编写了调用 REST API 并获取响应的方法,但我正在尝试找到如何使用 VBScript 解析 JSON 的解决方案。

请帮助我如何解析 json 响应? (代码如下) 或者是否更容易接受 xml 中的 REST 响应并在 VBS 中解析它?

感谢您的帮助和想法。谢谢!

userName    =   "[email protected]"
password    =   "blah.123"
acctNumber  =   "01999994201"

URL1="https://CXaic-blah.blah.ocp.blah.com:243/ic/api/integration/v1/flows/rest/blah_ACCNTSEARCH/1.0/accountSearch?accountNumber=" 
URL=URL1&acctNumber
Set objXmlHttpMain = CreateObject("Msxml2.ServerXMLHTTP") 
on error resume next 
objXmlHttpMain.open "GET",URL, False , userName, password
objXmlHttpMain.setRequestHeader "Accept", "application/json"
objXmlHttpMain.setRequestHeader "charset", "UTF-8"
objXmlHttpMain.send

restjsonresp    =   objXmlHttpMain.responseText

下面是我得到的json响应的格式:

{ 
   "searchResponse":{ 
      "element":[ 
         { 
            "accType":"R",
            "accountNumber":"1111111",
            "accountStatus":"A",
            "taxId":""
         }
      ]
   }
}
json xml vbscript qtp
2个回答
9
投票

虽然我没有 QTP/UFT 来测试或验证以下代码,但我按原样提供这些 JSON 解析解决方案用于实验...

1) 将 JScript 块注入“htmlfile”对象

Dim y, html : Set html = CreateObject("htmlfile")
Dim window : Set window = html.parentWindow
window.execScript "var json=" & restjsonresp & ";var e=new Enumerator(json.searchResponse.element);", "JScript"
While Not window.e.atEnd()
    Set y = window.e.item()
    Print "acctType: " & y.accType
    Print "accountNumber: " & y.accountNumber
    Print "accountStatus: " & y.accountStatus
    Print "taxId: " & y.taxId
    window.e.moveNext
Wend

2) 使用“MSScriptControl.ScriptControl”调用 JScript 代码(需要 32 位

Dim x, eng : Set eng = CreateObject("MSScriptControl.ScriptControl")
eng.Language = "JScript"
eng.AddCode "function json() { return " & restjsonresp & "; }"
Dim oResp : Set oResp = eng.Run("json")
For Each x In oResp.searchResponse.element
    Print "acctType: " & x.accType
    Print "accountNumber: " & x.accountNumber
    Print "accountStatus: " & x.accountStatus
    Print "taxId: " & x.taxId
Next

3) 将 JScript 块注入“InternetExplorer.Application”(过度杀伤?性能下降

Dim z, objIE : Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate2 "about:blank"
objIE.Toolbar = False
objIE.StatusBar = False
objIE.MenuBar = False
Do While objIE.Busy
    Wait 1
Loop
objIE.Visible = False
objIE.document.open "text/html"
objIE.document.write "<script type='text/javascript'>document.json=" & restjsonresp & ";document.jsonEnum = new Enumerator(document.json.searchResponse.element);</script>"
objIE.document.close
While Not objIE.document.jsonEnum.atEnd()
    Set z = objIE.document.jsonEnum.item()
    Print "acctType: " & z.accType
    Print "accountNumber: " & z.accountNumber
    Print "accountStatus: " & z.accountStatus
    Print "taxId: " & z.taxId
    objIE.document.jsonEnum.moveNext
Wend
objIE.Quit

4) 使用 Demon 的 VbsJson 对象(纯 VBScript 解决方案;尽管有更多代码

https://github.com/eklam/VbsJson

5) 使用正则表达式(仅适用于简单、定义明确的 JSON 响应

Dim re : Set re = New RegExp
re.IgnoreCase = True
re.Pattern = "\{\s*""searchResponse""\s*\:\s*\{\s*""element""\s*\:\s*\[\s*(\{\s*""accType""\s*\:\s*""(.*)""\s*,\s*""accountNumber""\s*\:\s*""(.*)""\s*,\s*""accountStatus""\s*\:\s*""(.*)""\s*,\s*""taxId""\s*\:\s*""(.*)""\s*\})\s*\]\s*\}\s*\}"
If re.Test(restjsonresp) Then
    Dim matches : Set matches = re.Execute(restjsonresp)
    Print "acctType: " & matches(0).SubMatches(1)
    Print "accountNumber: " & matches(0).SubMatches(2)
    Print "accountStatus: " & matches(0).SubMatches(3)
    Print "taxId: " & matches(0).SubMatches(4)
End If

6) 将 JSON 转换为 XML,然后解析 XML(大量代码,潜在的杀伤力

https://github.com/pravynandas/JSONToXML

如果您可以控制响应并提供 XML 而不是 JSON,那么最好在 QTP/UFT 中坚持使用 XML for VBScript。 无论如何,我希望这里的内容对您有所帮助。

享受吧。


0
投票

如果您使用WSF格式,您可以将JScript与WScript混合使用,例如

<?xml version="1.0" ?>
<!-- Example.wsf -->
<job id="Partially works">
  <script language="JScript" src="https://raw.githubusercontent.com/douglascrockford/JSON-js/refs/heads/master/json2.js"></script>
  <script language="JScript">
    function json_parse(str) { return JSON.parse(str); }
    function json_get(obj, key) { return obj[key]; }
  </script>
  <script language="VBScript">
'   <![CDATA[
         Dim obj
         Set obj = json_parse("[2,3,5,7]")
         WScript.Echo json_get(obj, 3) ' 7
         Set obj = json_parse("{ ""animal"" : ""cat"" }")
         WScript.Echo json_get(obj, "animal") ' cat
    ]]>
  </script>
</job>
PS C:\temp\so> cscript Example.wsf
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

7
cat
© www.soinside.com 2019 - 2024. All rights reserved.