在上一篇博客【VBA解析JSON数据(3)–JavaScript】讲到VBA无法直接获取Variant/Object/JScriptTypeInfo
对象中的Key,这个难题如何解决呢?
解铃还须系铃人,既然是JavaScript的对象,那么自然还是需要在JavaScript中寻求解决方法。
示例JSON数据如下所示。
{
"applySn": "粤G妆网备字2017050113",
"applySnTT": "",
"apply_enter_address": "",
"enterpriseName": "广州市金日精细化工有限公司",
"enterpriseNameTT": "",
"is_off": "N",
"newProcessid": "20170421153208vq3fu",
"off_date": "",
"org_name": "",
"processid": "20170421153208vq3fu",
"productName": "悠莅雅柔美亮肤按摩霜",
"productNameTT": "",
"provinceConfirm": "2017-05-17"
}
示例代码如下。
Public Sub JSON_JS_Plus()
Dim strJSON As String
Dim objJSON As Object
Dim arrKeys() As String
Dim Value As Variant
Dim j As Integer, k
Dim strJSCode As String
Dim objKeys As Object
Dim intKeyLen As Integer
With CreateObject("MSScriptControl.ScriptControl")
.Language = "javascript"
strJSCode = "function JSGetValue(jsonObj,strKey){return jsonObj[strKey];}"
strJSCode = strJSCode & " function JSGetKeys(jsonObj){var keys=new Array();for(var key in jsonObj){keys.push(key);}return keys;} "
.AddCode strJSCode
strJSON = [a1]
Set objJSON = .Eval("(" + strJSON + ")")
Set objKeys = .Run("JSGetKeys", objJSON)
intKeyLen = .Run("JSGetValue", objKeys, "length")
ReDim arrKeys(intKeyLen - 1)
j = 0
For Each k In objKeys
arrKeys(j) = k
j = j + 1
Next
Range("A3:B3").Value = Array("Name", "Value")
j = 4
For Each k In arrKeys
Cells(j, 1).Value = k
Cells(j, 2).Value = .Run("JSGetValue", objJSON, k)
j = j + 1
Next
End With
End Sub
代码解析
第10行代码使用后期绑定的方式创建ScriptControl
对象,如果使用前期绑定方式,需要在VBE中先引用Microsoft Script Control 1.0
。
第11行代码指定ScriptControl
对象的语言为JavaScript。
第12行代码为JS代码过程JSGetValue
,用于提取JSON对象中的VALUE。
第13行代码为JS代码过程JSGetKeys
,用于提取JSON对象中的KEY。
为了简化代码,VBA代码中使用了JavaScript Minify格式,格式化的JavaScript代码如下:
function JSGetValue(jsonObj, strKey) {
return jsonObj[strKey];
}
function JSGetKeys(jsonObj) {
var keys = new Array();
for (var key in jsonObj) {
keys.push(key);
}
return keys;
}
第14行为ScriptControl
对象添加代码。
第16行代码将JSON字符串转换JScriptTypeInfo
对象。
第17行代码调用过程JSGetKeys
提取KEY。
第21行到第23行代码使用循环过程将KEY保存到数组arrKeys
中。
第27行到第28行代码使用循环过程读取KEY对应的VALUE。
运行示例代码,结果如下。
世上无难事,问题总会能够解决的。
相关博文链接:
VBA解析JSON数据(1)-- Split函数
VBA解析JSON数据(2)–正则表达式
VBA解析JSON数据(3)–JavaScript
VBA解析JSON数据(4)–JavaScript进阶
VBA解析JSON数据(5)–JavaScript回写Excel