在本文中,我们将带你了解在Windows上的ExcelVBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的Ang
在本文中,我们将带你了解在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的Angular 2 – typescript中的window.print是什么、Excel VBA:解析的JSON对象循环、Javascript Windows.Location传递复杂的JSON对象、javascript – echo’d PHP编码通过AJAX调用的JSON返回到底是什么?。
本文目录一览:- 在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?
- Angular 2 – typescript中的window.print是什么
- Excel VBA:解析的JSON对象循环
- Javascript Windows.Location传递复杂的JSON对象
- javascript – echo’d PHP编码通过AJAX调用的JSON返回到底是什么?
在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?
可以看到有关在VBA中解析JSON的问题,但它们似乎错过了一两个技巧。
首先,我不再使用自定义JSON解析库,而是使用ScriptControl的Eval方法作为所有JSON代码的基础。另外,我们对本机Microsoft解决方案表示偏爱。
这是一个先前的问题,在Windows上的Excel
VBA中,如何减轻IDE的大写行为破坏解析的JSON的点语法遍历的问题?这个问题基于此。它显示了与使用点语法遍历已解析的JSON对象相比,使用VBA.CallByName的鲁棒性更高。还有另一个先前的问题,在Windows上的ExcelVBA中,如何遍历解析的JSON数组?显示了如何将其也用于访问数组元素。但是CallByName返回一个奇怪的变量类型,它在监视窗口中显示为Object/JScriptTypeInfo,并且如果一种类型的Debug.Print在当前窗口中(或将鼠标悬停在变量上)将获得无意义的“ [objectObject]”。在系列的另一个问题中[在Windows上的Excel VBA中,如何为解析的JSON变量获取字符串化的JSON表示形式而不是“object Object]”?我介绍了一些调试“糖”,它可以很好地检查变量。第四个问题,在Windows Excel
VBA中,如何获取JSON密钥以抢占“运行时错误‘438’:对象不支持此属性或方法”?,在研究如何查询成员的JSON对象时,我发现了似乎附加在JScriptTypeInfo对象上的hasOwnProperty()方法。
所以我问这个问题,这个JScriptTypeInfo到底是什么?
答案1
小编典典一个可能的地方是ScriptControl的类型库,因为这是散发此类型的库。
我的机器上此类型的完整详细信息是
Libary Name: Microsoft Script Control 1.0 (Ver 1.0) LIBID: {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}Location: C:\wINDOWS\SysWOW64\msscript.ocx
同时使用VBA IDE的对象浏览器和反汇编类型库的OLEVIEW.exe,我无法跟踪接口JScriptTypeInfo或方法hasOwnProperty。
但是脚本引擎托管的语言实现不是这种情况,例如VBScript和JScript(Java脚本的Microsoft名称)。
所以也许我们应该寻找一个JScript实现DLL,的确有一个细节。
Libary Name: Microsoft JScript GlobalsLIBID: {3EEF9759-35FC-11D1-8CE4-00C04FC2B085}Location: C:\wINDOWS\SysWOW64\jscript.dll
我机器上的哪个未注册,因此不在我的“工具”->“参考”库列表或OLEVIEW.exe中。我很幸运能在闲逛时找到。
这是OLEVIEW的一些输出,提供了类型库的摘录
[ uuid(3EEF9758-35FC-11D1-8CE4-00C04FC2B097)]dispinterface ObjectInstance { properties: methods: [id(0x0000044c)] StringInstance* toString(); [id(0x0000044d)] StringInstance* toLocaleString(); [id(0x0000044e)] VARIANT hasOwnProperty(VARIANT propertyName); [id(0x0000044f)] VARIANT propertyIsEnumerable(VARIANT propertyName); [id(0x00000450)] VARIANT isPrototypeOf(VARIANT obj); [id(0x00000451)] ObjectInstance* valueOf();};
上面的代码显示hasOwnProperty是IDispatch接口(或dispinterface)的一种方法,该方法是处理VBA对象声明为Object类型的(例如Dimfoo as Object
)必需的。使用regsvr32注册类型库似乎无济于事。必须在“工具参考”中浏览该文件才能在VBA的对象浏览器中查看。
我们可以很确定地知道这个JScript.dll文件,因为使用Process Explorer我们可以看到执行该行时正在加载dlloScriptEngine.Language = "JScript"
。在缺少注册类型库的情况下,我将文件JScript.dll加载到了Notepad
++中,并搜索了.JScriptTypeInfo作为正则表达式,发现一击。答对了!
不仅有一个ObjectInstance描述了VBA程序遇到的大多数变量,而且还有一个引人入胜的ArrayInstance,也许我们可以使用Javascript自己的数组函数,或者至少使用JScript.dll类型库中记录的子集。这是一些示例代码
''Tools->References->''Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx''and FYI/browsing capabilities Microsoft JScript Globals; C:\wINDOWS\SysWOW64\jscript.dllOption ExplicitPrivate Sub TestJSONParsingWithCallByName5() Dim oScriptEngine As ScriptControl Set oScriptEngine = New ScriptControl oScriptEngine.Language = "JScript" Dim sJsonString(0 To 1) As String sJsonString(0) = "{''key1'': ''value1'' ,''key2'': { ''key3'': ''value3'' } }" sJsonString(1) = "[ 1234, 2345, 3456, 4567, 5678, 6789 ]" Dim objJSON(0 To 1) As Object Set objJSON(0) = oScriptEngine.Eval("(" + sJsonString(0) + ")") Set objJSON(1) = oScriptEngine.Eval("(" + sJsonString(1) + ")") Debug.Assert objJSON(0).hasOwnProperty("key1") Debug.Assert objJSON(0).hasOwnProperty("key2") Debug.Assert CallByName(objJSON(1), "length", VbGet) = 6 Debug.Assert CallByName(objJSON(1), "0", VbGet) = "1234" ''* Is objJSON(1) an ArrayInstance? ''* does it support the reverse method of the ArrayInstance object? ''Call objJSON(1).Reverse ''* reverse gets capitalised into Reverse ... grrrr Call CallByName(objJSON(1), "reverse", VbMethod) ''* so use CallByName as solution to "helpful" capitalisation ''* Yes, the elements are reversed! Debug.Assert CallByName(objJSON(1), "length", VbGet) = 6 Debug.Assert CallByName(objJSON(1), "0", VbGet) = "6789" Stop ''** And now we know objJSON(1) is an ArrayInstance we can have some fun with array operations Dim objSplice As Object Set objSplice = CallByName(objJSON(1), "splice", VbMethod, 2, 1) Debug.Assert CallByName(objJSON(1), "length", VbGet) = 5 Debug.Assert CallByName(objSplice, "length", VbGet) = 1 Dim objSlice As Object Set objSlice = CallByName(objJSON(1), "slice", VbMethod, 2) Debug.Assert CallByName(objJSON(1), "length", VbGet) = 5 Debug.Assert CallByName(objSlice, "length", VbGet) = 3 Stop Call CallByName(objJSON(1), "sort", VbMethod) Debug.Assert CallByName(objJSON(1), "join", VbMethod) = "1234,2345,3456,5678,6789" Debug.Assert CallByName(objJSON(1), "join", VbMethod, " ") = "1234 2345 3456 5678 6789" Stop Debug.Assert CallByName(objJSON(1), "pop", VbMethod) = "6789" Debug.Assert CallByName(objJSON(1), "length", VbGet) = 4 StopEnd Sub
简介:JScriptTypeInfo是要在VBAIDE监视窗口中显示的内容以及VBA函数TypeName()的返回,但是它实际上隐藏了可以在JScript.dll中找到的许多对象。我想可以将其描述为多态的,也许最好将其描述为后期绑定。要查看功能,请使用“工具参考”并浏览到JScript.dll。
Angular 2 – typescript中的window.print是什么
window.print()
打开打印机对话框,但是如何在打字稿中执行此操作?
解决方法
(window as any).print();
如果不使用typescript 2.8.2,请使用以上行.
Excel VBA:解析的JSON对象循环
下面的每个示例…从解析的JSON字符串遍历对象将返回错误“对象不支持此属性或方法”。谁能建议如何进行这项工作?非常感谢(我花了6个小时在这里问一个答案)。
将JSON字符串解析为对象的函数(可以正常运行)。
Function jsonDecode(jsonString As Variant)
Set sc = CreateObject("ScriptControl"): sc.Language = "JScript"
Set jsonDecode = sc.Eval("(" + jsonString + ")")
End Function
循环遍历已解析的对象将返回错误“对象不支持此属性或方法”。
Sub TestJsonParsing()
Dim arr As Object 'Parse the json array into here
Dim jsonString As String
'This works fine
jsonString = "{'key1':'value1','key2':'value2'}"
Set arr = jsonDecode(jsonString)
MsgBox arr.key1 'Works (as long as I know the key name)
'But this loop doesn't work - what am I doing wrong?
For Each keyName In arr.keys 'Excel errors out here "Object doesn't support this property or method"
MsgBox "keyName=" & keyName
MsgBox "keyValue=" & arr(keyName)
Next
End Sub
PS。我已经研究了这些库:
- VBA的JSON无法获得的例子工作。
- VBJSON有没有包括VBA脚本(这可能工作,但不知道如何将其加载到Excel和有最小的文档)。
另外,是否可以访问多维解析的JSON数组?仅使基本的键/值数组循环正常工作就好了(很抱歉,如果要求太多)。谢谢。
编辑:这是使用vba-json库的两个工作示例。上面的问题仍然是个谜。
Sub TestJsonDecode() 'This works,uses vba-json library
Dim lib As New JSONLib 'Instantiate JSON class object
Dim jsonParsedObj As Object 'Not needed
jsonString = "{'key1':'val1','key2':'val2'}"
Set jsonParsedObj = lib.parse(CStr(jsonString))
For Each keyName In jsonParsedObj.keys
MsgBox "Keyname=" & keyName & "//Value=" & jsonParsedObj(keyName)
Next
Set jsonParsedObj = Nothing
Set lib = Nothing
End Sub
Sub TestJsonEncode() 'This works,uses vba-json library
Dim lib As New JSONLib 'Instantiate JSON class object
Set arr = CreateObject("Scripting.Dictionary")
arr("key1") = "val1"
arr("key2") = "val2"
MsgBox lib.toString(arr)
End Sub
Javascript Windows.Location传递复杂的JSON对象
我将以下对象传递给MVC控制器:
this.JsonData = {
"__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val(),
"searchMode": {
"mode": Number(mode.val()),
"pageSize": Number(pagesize.val()) || 5, "pageNumber": Number(pagenumber.val()) || 1,
"sortField": sortfield.val() || "Ref",
"sortDirection": sortdirection.val() || "desc"
},
"searchData": {
"Compare": Number(StdComparison.val()),
"SearchTextFrom": searchText.val(),
"SearchTextTo": searchTextTo.val()
}
这项工作正常,但是最近出现了要求,我希望对该对象进行编码以与javascript函数Window.location一起使用
我曾经使用的建议:
how-to-pass-complex-json-object-in-url-using-javascript
window.location + "?SearchCriteria=" + JSON.Stringify(this.JsonData);
创建以下请求:
Controller/Action?SearchCriteria={
"__RequestVerificationToken": "tokenvalue",
"searchMode": {
"mode": 2,
"pageSize": 5,
"pageNumber": 1,
"sortField": "Ref",
"sortDirection": "desc"
},
"searchData": {
"Compare": 1,
"SearchTextFrom": "From A",
"SearchTextTo": "To Z"
}
}
鉴于
window.location + "?SearchCriteria=" + this.JsonData;
产生以下内容:
Controller/Action?SearchCriteria=[object%20Object]
在上述两个页面上都找不到页面错误.
更新:
我一直在寻求答案.
根据助手的要求,我提供了更多的源代码.
我有三堂课.
public class MainSearch
{
public MainSearch()
{
SearchData searchData = new SearchData();
SearchMode searchMode = new SearchMode();
}
public SearchData searchData { get; set; }
public SearchMode searchMode { get; set; }
public int? page { get; set; }
public object ToPagedListParameters(int pagenumber)
{
searchMode.pageNumber = pagenumber;
return page;
}
public IList<string> ValidationErrorMessages { get; set; }
}
public class SearchData
{
// Fields used for the ticket number search
public int? ticketNumberCompare { get; set; }
public string ticketSearchTextFrom { get; set; }
public string ticketSearchTextTo { get; set; }
}
public class SearchMode
{
public int? mode { get; set; }
public int? pageNumber { get; set; }
public int? pageSize { get; set; }
public string sortDirection { get; set; }
public string sortField { get; set; }
public string userURN { get; set; }
public string __RequestVerificationToken { get; set; }
}
这些类包含用于搜索的条件(SearchData已被截断)
以下是我的控制器代码:
[HttpGet]
public ActionResult DownloadFileCSV(MainSearch search)
{
string fileName = Server.MapPath("~/Content/Pdf/") + "somefile.pdf";
byte[] fileContents = System.IO.File.ReadAllBytes(fileName);
return File(fileContents, "application/pdf", "result.pdf");
}
最后,是从cshtml文件进行的Ajax调用.
$("#DownloadAttachmentCSV").click(function () {
$.ajax(
{
url: '@Url.Action("DownloadFileCSV", "Home")',
contentType: 'application/json; charset=utf-8',
datatype: 'json',
data: JsonData,
type: "GET",
success: function () {
window.location = '@Url.Action("DownloadFileCSV", "Home")' + '?' + JsonData;
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
});
奇怪的是,上面的代码确实可以正常工作并且文件已下载,但这是问题所在. JSON数据未填充MainSearch变量.
到目前为止,获取JSON数据以填充c#类的唯一方法是将方法更改为POST.
一定是这样吗?
解决方法:
您不能将复杂的javascript对象传递给这样的GET方法. GET没有主体,要绑定到模型,您的查询字符串名称/值对必须与绑定到的对象的属性匹配.例如,要绑定到MainSearch的SearchMode属性的mode属性,您查询的字符串将需要包含
....&SearchMode.mode=2....
将您用来生成javascript对象的代码更改为
var data = {
'searchMode.mode': mode.val(),
'searchMode.pageSize': pagesize.val() || 5,
'searchMode.pageNumber': pagenumber.val() || 1,
'searchMode.sortField': sortfield.val() || "Ref",
'searchMode.sortDirection': sortdirection.val() || "desc",
'searchData.SearchTextFrom': StdComparison.val(),
'searchData.Compare': searchText.val(),
'searchData.SearchTextTo': searchTextTo.val(),
}
和ajax代码
$.ajax(
{
url: '@Url.Action("DownloadFileCSV", "Home")' + '?' + $.param(data),
type: "GET",
success: function () {
另请注意以下
>使用Number(..)将值转换为a是没有意义的
数字-全部通过文本发送
> GET没有主体,因此设置ajax contentType选项为
无意义
>您的方法不会返回json,因此数据类型:’json’不会
感.
>无需将防伪令牌传递给GET方法
话虽如此,目前尚不清楚您想在这里做什么. MainSearch search()方法中的代码从不使用模型的任何值.并且它返回一个FileResult,该结果不能与ajax调用一起使用(但是它可以与window.location一起使用,在这种情况下,成功回调中的代码需要
var baseUrl = '@Url.Action("DownloadFileCSV", "Home")';
var queryString = $.param(data);
window.location = baseUrl + '?' + queryString;
但是还不清楚为什么要对该方法进行2次调用-ajax调用,然后进行重定向(ajax调用根本不执行任何操作).
javascript – echo’d PHP编码通过AJAX调用的JSON返回到底是什么?
我想我在这里遗漏了一些东西:
使用AjAX我从数据库中获取一些数据并以JSON格式发回
$jsondata = array();
while ($Row = MysqL_fetch_array($params))
{
$jsondata[]= array('cat_id'=>$Row["cat_id"],'category'=>$Row["category"],'category_desc'=>$Row["category_desc"],'cat_bgd_col'=>$Row["cat_bgd_col"]);
};
echo("{\"Categories\": ".json_encode($jsondata)."};");
到目前为止我没有问题.
在cleint方面,我收到上面的内容
ajaxRequest.responseText
如果我这样做
var categoriesObject = ajaxRequest.responseText;
alert(categoriesObject);
我看到了我期望看到的内容,即警报中的整个数组.
一切都出错的是尝试访问响应.我得到的错误是“categoriesObject”不是一个对象 – 如果不是它是什么?我的错误是我甚至无法像这样访问它:
document.write(categoriesObject.Categories[0].category);
那么我做错了什么?
echo json_encode(array('Categories' => $jsondata));
要不就
echo json_encode($jsondata);
我没有看到添加类别的理由.
>您必须使用JSON.parse
(在大多数浏览器中提供,但也可用作script)在客户端解码JSON:
var data = JSON.parse(ajaxRequest.responseText);
>如果您想要非常正确,请添加
header('Content-type: application/json');
到您的PHP脚本.
今天关于在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?的介绍到此结束,谢谢您的阅读,有关Angular 2 – typescript中的window.print是什么、Excel VBA:解析的JSON对象循环、Javascript Windows.Location传递复杂的JSON对象、javascript – echo’d PHP编码通过AJAX调用的JSON返回到底是什么?等更多相关知识的信息可以在本站进行查询。
本文标签: