GVKun编程网logo

在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?

15

在本文中,我们将带你了解在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到底是什么?

在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我们可以看到执行该行时正在加载dll
oScriptEngine.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是什么

Angular 2 – typescript中的window.print是什么

在 javascript我可以做:

window.print()

打开打印机对话框,但是如何在打字稿中执行此操作?

解决方法

(window as any).print();

如果不使用typescript 2.8.2,请使用以上行.

Excel VBA:解析的JSON对象循环

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对象

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返回到底是什么?

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);

那么我做错了什么?

最佳答案
>您不应手动创建JSON.使用:

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返回到底是什么?等更多相关知识的信息可以在本站进行查询。

本文标签: