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