VBA中使用JavaScript腳本語言解析JSON數據


JSON:JavaScript 對象表示法(JavaScript Object Notation)

和xml相似,都是文本形式(保存在文本文件中或字符串等形式),比如:

jsstr = {"系別":"歷史系","班級":"一班",
           "學員":[
                   {"姓名":"張三","年齡":25,"性別":"男"},
                   {"姓名":"李四","年齡":20,"性別":"男"},
                   {"姓名":"小明","年齡":20,"性別":"女"}
                  ]
          }
        

1、{}表示對象,[]表示數組,數組的成員可以是對象,對象的屬性和值用“屬性:值”鍵值對形式表示。

     本例中jsstr對象有三個屬性:系別,班級,學員。其中“學員”屬性的值是一個包含三名學員對象的數組,

2、相對XML更輕量,xml的標簽比數據還要多。

在VBA中可以使用Javascript解析json對象:

先引用Microsoft Script Control 1.0,文件是:msscript.ocx

 1 Sub TestJson()
 2 Dim jsstr As String
 3 
 4 'vb搞個字符串要加n個引號,真是煩人
 5 jsstr = "{""系別"":""歷史系"",""班級"":""一班""," & _
 6          """學員"":[{""姓名"":""張三"",""年齡"":25,""性別"":""男""}," & _
 7                    "{""姓名"":""李四"",""年齡"":20,""性別"":""男""}," & _
 8                    "{""姓名"":""小明"",""年齡"":20,""性別"":""女""}" & _
 9                   "]" & _
10          "}"
11         
12 '前期綁定方便使用智能提示
13 Dim scobj As New MSScriptControl.ScriptControl
14 Dim age As Integer
15 
16 'ScriptControl使用的腳本語言。除了js,也支持Vbscript
17 scobj.Language = "JavaScript"
18 
19 '往腳本里添加代碼,參數是字符串
20 scobj.AddCode ("var query = " & jsstr)
21 
22 'JSON對象獲取屬性的表示方法:對象.屬性
23 '屬性的值如果是個包含多個對象的數組,可以使用索引表示取得對象:對象.屬性[0]
24 'Eval是表達式求值
25 age = scobj.Eval("query.學員[2].年齡")
26 
27 Debug.Print "歷史系一班的第3個學員的年齡是" & age & ""
28         
29 End Sub

1、javascript是弱類型語言。定義變量的關鍵字是var

var x;
var y = 10 ;
var name = "張三" ;

2、Eval是表達式求值,參數是字符串,如果是解析一個JSON對象,最好是使用一對括號把文本包括住,這樣可以避免語法錯誤。

var obj = eval ("(" + jsstr + ")");

3、CodeObject方法,暴露腳本對象給VB。(這個方法沒摸透)

 1 Sub TestJson2()
 2 Dim jsstr1 As String
 3 Dim jsstr2 As String
 4 jsstr1 = "{""姓名"":""張三"",""性別"":""男""}"
 5 jsstr2 = "{""姓名"":""小花"",""性別"":""女""}"
 6 
 7 Dim scobj As New MSScriptControl.ScriptControl
 8 scobj.Language = "JavaScript"
 9 scobj.AddCode ("var query1 = " & jsstr1)    'query1,query2分別是兩個Javascript對象
10 scobj.AddCode ("var query2 = " & jsstr2)
11 'CallByName分別取出CodeObject中的query1、query2對象,並找到姓名屬性的值
12 Debug.Print CallByName(CallByName(scobj.CodeObject, "query1", VbGet), "姓名", VbGet) 13 Debug.Print CallByName(CallByName(scobj.CodeObject, "query2", VbGet), "姓名", VbGet) 14 15 End Sub

CallByName是VB中的方法。

通過本地窗口可以看到scobj對象和內部的codeobject

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM