{"id":1191,"date":"2021-07-17T09:29:32","date_gmt":"2021-07-17T01:29:32","guid":{"rendered":"http:\/\/www.luwl.net\/?p=1191"},"modified":"2021-07-17T09:29:32","modified_gmt":"2021-07-17T01:29:32","slug":"asp-%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bd%acjson%e4%bb%a3%e7%90%86","status":"publish","type":"post","link":"http:\/\/www.luwl.net\/?p=1191","title":{"rendered":"asp \u6570\u636e\u5e93\u8f6cjson\u4ee3\u7406"},"content":{"rendered":"\r\n<pre class=\"wp-block-code\"><code>&lt;%@ LANGUAGE = VBScript CodePage = 65001%>\r\n&lt;%\r\nclass JSON\r\nprivate output, innerCall\r\npublic toResponse        ''[bool] should generated results be directly written to the response? default = false\r\npublic sub class_initialize()\r\n        newGeneration()\r\n        toResponse = false\r\nend sub\r\npublic function escape(val)\r\ndim cDoubleQuote, cRevSolidus, cSolidus\r\n        cDoubleQuote = &amp;h22\r\n        cRevSolidus = &amp;h5C\r\n        cSolidus = &amp;h2F\r\ndim i, currentDigit\r\nfor i = 1 to (len(val))\r\n            currentDigit = mid(val, i, 1)\r\nif ascw(currentDigit) > &amp;h00 and ascw(currentDigit) &lt; &amp;h1F then\r\n                currentDigit = escapequence(currentDigit)\r\nelseif ascw(currentDigit) >= &amp;hC280 and ascw(currentDigit) &lt;= &amp;hC2BF then\r\n                currentDigit = \"\\u00\" + right(padLeft(hex(asc(currentDigit) - &amp;hC200), 2, 0), 2)\r\nelseif ascw(currentDigit) >= &amp;hC380 and ascw(currentDigit) &lt;= &amp;hC3BF then\r\n                currentDigit = \"\\u00\" + right(padLeft(hex(ascw(currentDigit) - &amp;hC2C0), 2, 0), 2)\r\nelse\r\nselect case ascw(currentDigit)\r\ncase cDoubleQuote: currentDigit = escapequence(currentDigit)\r\ncase cRevSolidus: currentDigit = escapequence(currentDigit)\r\ncase cSolidus: currentDigit = escapequence(currentDigit)\r\nend select\r\nend if\r\n            escape = escape &amp; currentDigit\r\nnext\r\nend function\r\npublic function toJSON(name, val, nested)\r\nif not nested and not isEmpty(name) then write(\"{\")\r\nif not isEmpty(name) then write(\"\"\"\" &amp; escape(name) &amp; \"\"\": \")\r\n        generateValue(val)\r\nif not nested and not isEmpty(name) then write(\"}\")\r\n        toJSON = output\r\nif innerCall = 0 then newGeneration()\r\nend function\r\nprivate function generateValue(val)\r\nif isNull(val) then\r\n            write(\"null\")\r\nelseif isArray(val) then\r\n            generateArray(val)\r\nelseif isObject(val) then\r\nif val is nothing then\r\n                write(\"null\")\r\nelseif typename(val) = \"Dictionary\" then\r\n                generateDictionary(val)\r\nelseif typename(val) = \"Recordset\" then\r\n                generateRecordset(val)\r\nelse\r\n                generateObject(val)\r\nend if\r\nelse\r\n'bool\r\n            varTyp = varType(val)\r\nif varTyp = 11 then\r\nif val then write(\"true\") else write(\"false\")\r\n'int, long, byte\r\nelseif varTyp = 2 or varTyp = 3 or varTyp = 17 or varTyp = 19 then\r\n                write(cLng(val))\r\n'single, double, currency\r\nelseif varTyp = 4 or varTyp = 5 or varTyp = 6 or varTyp = 14 then\r\n                write(replace(cDbl(val), \",\", \".\"))\r\nelse\r\n                write(\"\"\"\" &amp; escape(val &amp; \"\") &amp; \"\"\"\")\r\nend if\r\nend if\r\n        generateValue = output\r\nend function\r\n\r\nprivate sub generateArray(val)\r\ndim item, i\r\n        write(\"[\")\r\n        i = 0\r\n'the for each allows us to support also multi dimensional arrays\r\nfor each item in val\r\nif i > 0 then write(\",\")\r\n            generateValue(item)\r\n            i = i + 1\r\nnext\r\n        write(\"]\")\r\nend sub\r\nprivate sub generateDictionary(val)\r\ndim keys, i\r\n        innerCall = innerCall + 1\r\n        write(\"{\")\r\n        keys = val.keys\r\nfor i = 0 to uBound(keys)\r\nif i > 0 then write(\",\")\r\n            toJSON keys(i), val(keys(i)), true\r\nnext\r\n        write(\"}\")\r\n        innerCall = innerCall - 1\r\nend sub\r\n'*******************************************************************\r\n'* generateRecordset\r\n'*******************************************************************\r\nprivate sub generateRecordset(val)\r\ndim i\r\n        write(\"[\")\r\nwhile not val.eof\r\n            innerCall = innerCall + 1\r\n            write(\"{\")\r\nfor i = 0 to val.fields.count - 1\r\nif i > 0 then write(\",\")\r\n                toJSON lCase(val.fields(i).name), val.fields(i).value, true\r\nnext\r\n            write(\"}\")\r\n            val.movenext()\r\nif not val.eof then write(\",\")\r\n            innerCall = innerCall - 1\r\nwend\r\n        write(\"]\")\r\nend sub\r\n'*******************************************************************************\r\n'* generateObject\r\n'*******************************************************************************\r\nprivate sub generateObject(val)\r\ndim props\r\non error resume next\r\nset props = val.reflect()\r\nif err = 0 then\r\non error goto 0\r\n            innerCall = innerCall + 1\r\n            toJSON empty, props, true\r\n            innerCall = innerCall - 1\r\nelse\r\non error goto 0\r\n            write(\"\"\"\" &amp; escape(typename(val)) &amp; \"\"\"\")\r\nend if\r\nend sub\r\n'*******************************************************************************\r\n'* newGeneration\r\n'*******************************************************************************\r\nprivate sub newGeneration()\r\n        output = empty\r\n        innerCall = 0\r\nend sub\r\n'*******************************************************************************\r\n'* JsonEscapeSquence\r\n'*******************************************************************************\r\nprivate function escapequence(digit)\r\n        escapequence = \"\\u00\" + right(padLeft(hex(asc(digit)), 2, 0), 2)\r\nend function\r\n'*****************************************************************************\r\n'* padLeft\r\n'*****************************************************************************\r\nprivate function padLeft(value, totalLength, paddingChar)\r\n        padLeft = right(clone(paddingChar, totalLength) &amp; value, totalLength)\r\nend function\r\n'*****************************************************************************\r\n'* clone\r\n'******************************************************************************************\r\npublic function clone(byVal str, n)\r\ndim i\r\nfor i = 1 to n : clone = clone &amp; str : next\r\nend function\r\n'******************************************************************************************\r\n'* write\r\n'******************************************************************************************\r\nprivate sub write(val)\r\nif toResponse then\r\n            response.write(val)\r\nelse\r\n            output = output &amp; val\r\nend if\r\nend sub\r\nend class  \r\n          \r\nresponse.ContentType=\"text\/json\"\r\ndim j\r\n'\u591a\u91cd\u5d4c\u5957\u7684JSON,\u8981\u4f7f\u7528Dictionary\u624d\u80fd\u5b9e\u73b0\r\nset j=new json\r\nset jso=server.createobject(\"scripting.dictionary\")\r\n\r\ndbstr = request(\"dbstr\") \t\t\t'\u8bbe\u7f6e\u6bcf\u9875\u663e\u793a\u7684\u8bb0\u5f55\u6570\r\nif dbstr = \"\" then dbstr = \"driver={SQL Server};Server=;UID=yxbl;PWD=yxbl;database=GlassQualityTest\"\r\n'if dbstr = \"\" then dbstr = \"DSN=sql;Database=GlassQualityTest;UID=yxbl;PWD=yxbl;\"\r\nconn()\r\nfunction conn()\r\n\tdim conn1,connstr\r\n\ton error resume next\r\n\t\tset conn1 = Server.CreateObject(\"ADODB.Connection\") \r\n\t\tconn1.open dbstr\r\n\tif err &lt;> 0 then\r\n    jso.add \"dbstr\",dbstr\r\n\t\tjso.add \"err\",err.description\r\n\t\tresponse.write j.toJSON(empty,jso,false)\r\n\t\tresponse.end\r\n\tend if\r\n\tset conn = conn1\r\nend function\r\nSub echo(str)\r\n\tResponse.Write(str)\r\nEnd Sub\r\n'\u6b63\u5219\u8868\u8fbe\u5f0f\u51fd\u6570\uff0c\u7528\u4e8e\u5220\u9664\u6ce8\u91ca\r\n'-------------------------------------\r\nFunction RegExpReplace(strng, patrn, replStr)\r\n  Dim regEx,match,matches              ' \u5efa\u7acb\u53d8\u91cf\u3002\r\n  Set regEx = New RegExp               ' \u5efa\u7acb\u6b63\u5219\u8868\u8fbe\u5f0f\u3002\r\n  regEx.Pattern = patrn               ' \u8bbe\u7f6e\u6a21\u5f0f\u3002\r\n  regEx.IgnoreCase = True               ' \u8bbe\u7f6e\u662f\u5426\u533a\u5206\u5927\u5c0f\u5199\u3002\r\n  regEx.Global = True   ' \u8bbe\u7f6e\u5168\u5c40\u53ef\u7528\u6027\u3002\r\n  RegExpReplace = regEx.Replace(strng, replStr)         ' \u4f5c\u66ff\u6362\u3002\r\nEnd Function\r\n'==================================================================\u663e\u793a\u67e5\u8be2\r\nsub showselect(sql)\r\n\tdim page,pageUrl,strdel,geturl\t\t\t\t\t\r\n\tpageSize = request(\"pageSize\") \t\t\t'\u8bbe\u7f6e\u6bcf\u9875\u663e\u793a\u7684\u8bb0\u5f55\u6570\r\n\tif pageSize = \"\" or not isNumeric(pageSize) then pageSize = 500\r\n\tpage = request(\"page\")           '\u8bbe\u7f6e\u5f53\u524d\u663e\u793a\u7684\u9875\u6570\r\n\tif page=\"\" or not isNumeric(page) then page=1\r\n\tpageUrl = \"?sql=\" &amp; Server.URLEncode(sql)\r\n   dim rs\r\n   set rs = Server.CreateObject(\"ADODB.Recordset\")\r\n   rs.Open sql,conn,3\r\n   if not rs.eof then\r\n   \t  rs.pageSize = pageSize\r\n\t  if cint(page) &lt; 1 then page = 1\r\n   \t  if cint(page) > rs.PageCount then page = rs.PageCount\r\n   \t  rs.absolutePage = page\r\n   end if\r\n   set pag=server.createobject(\"scripting.dictionary\")\r\n\t  pag.add \"page\",page\r\n\t  pag.add \"pageSize\",pageSize\r\n\t  pag.add \"recordCount\",rs.recordCount\r\n\t  pag.add \"PageCount\",rs.PageCount\r\n\t  jso.add \"page\",pag\r\n    jso.add \"rs\",rs\r\nend sub\r\nsub exesql(sql)\r\n\ton error resume next\r\n\tif sql = \"\" then exit sub\r\n    sql = RegExpReplace(sql, \"(--)(.)*\\n\", \"\")   '\u66ff\u6362\u6ce8\u91ca\r\n    sql = RegExpReplace(sql, \"\\n[\\s| ]*\\r\", \"\")  '\u66ff\u6362\u7a7a\u884c\r\n    sql = RegExpReplace(sql, \"\\n\", \"\")           '\u66ff\u6362\u6362\u884c\u7b26\r\n    sql = RegExpReplace(sql, \"\\r\", \"\")           '\u66ff\u6362\u56de\u8f66\u7b26\r\n    if (LCase(left(sql,len(\"select\"))) = \"select\") and instr(sql,\"into\") = 0 then '\u53ea\u5141\u8bb8select\r\n     Call showSelect (sql)\r\n\t   if err &lt;> 0 then \r\n       jso.add \"sql\",trim(request(\"sql\"))\r\n       jso.add \"err\",err.description\r\n       response.write j.toJSON(empty,jso,false)\r\n       response.end\r\n     end if\r\n    end if\r\nend sub\r\n  call exesql(trim(request(\"sql\")))\r\n  response.write j.toJSON(empty,jso,false)\r\n%><\/code><\/pre>\r\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1191","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts\/1191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1191"}],"version-history":[{"count":1,"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts\/1191\/revisions"}],"predecessor-version":[{"id":1192,"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts\/1191\/revisions\/1192"}],"wp:attachment":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1191"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}