zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    移动零【283】
    下一个排列【31】
    插入区间【57】
    有效的山脉数组【941】
    两个数组的交集【349】
    求根到叶子节点数字之和【129】
    解决已经pip 安装成功的第三方包,但总是标红或者运行报错import PendingDeprecationWarning
    String、StringBuffer与StringBuilder之间区别
    《Java 核心技术第 10 版》-- 读书笔记
    【转载】如何保证消息不被重复消费?
  • 原文地址:https://www.cnblogs.com/zzstone/p/5569723.html
Copyright © 2011-2022 走看看