可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I\'ve been able to find a zillion libraries for generating JSON in Classic ASP (VBScript) but I haven\'t been to find ANY for parsing.
I want something that I can pass a JSON string and get back a VBScript object of some sort (Array, Scripting.Dictionary, etc)
Can anyone recommend a library for parsing JSON in Classic ASP?
回答1:
Keep in mind that Classic ASP includes JScript as well as VBScript. Interestingly, you can parse JSON using JScript and use the resulting objects directly in VBScript.
Therefore, it is possible to use the canonical https://github.com/douglascrockford/JSON-js/blob/master/json2.js in server-side code with zero modifications.
Of course, if your JSON includes any arrays, these will remain JScript arrays when parsing is complete. You can access the contents of the JScript array from VBScript using dot notation.
<%@Language=\"VBScript\" %>
<%
Option Explicit
%>
<script language=\"JScript\" runat=\"server\" src=\'path/to/json2.js\'></script>
<%
Dim myJSON
myJSON = Request.Form(\"myJSON\") // \"[ 1, 2, 3 ]\"
Set myJSON = JSON.parse(myJSON) // [1,2,3]
Response.Write(myJSON) // 1,2,3
Response.Write(myJSON.[0]) // 1
Response.Write(myJSON.[1]) // 2
Response.Write(myJSON.[2]) // 3
%>
回答2:
Not sure about it. Have you checked ASP extreme framework which has JSON support?
回答3:
I couldn\'t get the extreme-evolution or Chris Nielson\'s suggestion to work.
But, the following did work for me:
http://tforster.wik.is/ASP_Classic_Practices_For_The_21st_Century/JSON4ASP
Download the following as \"json2.min.asp\"
http://tforster.wik.is/@api/deki/files/2/=json2.min.asp
Add the following line to the top of your ASP file:
<script language=\"javascript\" runat=\"server\" src=\"json2.min.asp\"></script>
You can then use JSON in ASP.
Dim car: Set car = JSON.parse(\"{\"\"brand\"\":\"\"subaru\"\",\"\"model\"\":\"\"outback sport\"\",\"\"year\"\":2003,\" & _
\"\"\"colour\"\":\"\"green\"\",\"\"accessories\"\":[\" & _
\"{\"\"foglamps\"\":true},{\"\"abs\"\":true},{\"\"heatedSeats\"\":true}]}\")
Response.Write(\"brand: \" & car.brand & \"<br/>\")
Response.Write(\"model: \" & car.model & \"<br/>\")
Response.Write(\"colour: \" & car.colour & \"<br/>\")
Response.Write(\"has foglamps: \" & CStr(car.accessories.get(0).foglamps) & \"<br/>\")
car.accessories.get(0).foglamps = false
Response.Write(\"has foglamps: \" & CStr(car.accessories.get(0).foglamps) & \"<br/>\")
Response.Write(\"new Json: \" & JSON.stringify(car) & \"<br/>\")
Set car = Nothing
Note: To parse through an array of items, you need to do the following:
for each iTmp in testing
if (TypeName(iTmp))<>\"JScriptTypeInfo\" then
Response.Write(\"Item: \" & iTmp & \"<br/>\")
end if
next
回答4:
I have recently implemented a VbsJson class, which has a \"Decode\" method to parse JSON to VBScript and a \"Encode\" method to generate JSON from VBScript. The code is somewhat long, so I don\'t paste it here.
回答5:
http://github.com/nagaozen/asp-xtreme-evolution/
回答6:
I wrote this answer when I was looking for a light-weight pure VBScript only solution.
By putting together a rudimentary JSON to XML converter, we can walk the JSON string and turn it into a Microsoft.XMLDOM document.
From there, we use Microsoft\'s XML API including XPath queries to pluck out any values we wanted.
This handles simple JSON, but, I never intended this answer for anything more sophisticated.
For a more robust solution, the best JSON interpreter, is a proper Javascript engine. Therefore, I highly recommend the accepted answer to this question i.e. Any good libraries for parsing JSON in Classic ASP?
Function JSONtoXML(jsonText)
Dim idx, max, ch, mode, xmldom, xmlelem, xmlchild, name, value
Set xmldom = CreateObject(\"Microsoft.XMLDOM\")
xmldom.loadXML \"<xml/>\"
Set xmlelem = xmldom.documentElement
max = Len(jsonText)
mode = 0
name = \"\"
value = \"\"
While idx < max
idx = idx + 1
ch = Mid(jsonText, idx, 1)
Select Case mode
Case 0 \' Wait for Tag Root
Select Case ch
Case \"{\"
mode = 1
End Select
Case 1 \' Wait for Attribute/Tag Name
Select Case ch
Case \"\"\"\"
name = \"\"
mode = 2
Case \"{\"
Set xmlchild = xmldom.createElement(\"tag\")
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
Case \"[\"
Set xmlchild = xmldom.createElement(\"tag\")
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
Case \"}\"
Set xmlelem = xmlelem.parentNode
Case \"]\"
Set xmlelem = xmlelem.parentNode
End Select
Case 2 \' Get Attribute/Tag Name
Select Case ch
Case \"\"\"\"
mode = 3
Case Else
name = name + ch
End Select
Case 3 \' Wait for colon
Select Case ch
Case \":\"
mode = 4
End Select
Case 4 \' Wait for Attribute value or Tag contents
Select Case ch
Case \"[\"
Set xmlchild = xmldom.createElement(name)
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
name = \"\"
mode = 1
Case \"{\"
Set xmlchild = xmldom.createElement(name)
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
name = \"\"
mode = 1
Case \"\"\"\"
value = \"\"
mode = 5
Case \" \"
Case Chr(9)
Case Chr(10)
Case Chr(13)
Case Else
value = ch
mode = 7
End Select
Case 5
Select Case ch
Case \"\"\"\"
xmlelem.setAttribute name, value
mode = 1
Case \"\\\"
mode = 6
Case Else
value = value + ch
End Select
Case 6
value = value + ch
mode = 5
Case 7
If Instr(\"}], \" & Chr(9) & vbCr & vbLf, ch) = 0 Then
value = value + ch
Else
xmlelem.setAttribute name, value
mode = 1
Select Case ch
Case \"}\"
Set xmlelem = xmlelem.parentNode
Case \"]\"
Set xmlelem = xmlelem.parentNode
End Select
End If
End Select
Wend
Set JSONtoXML = xmlDom
End Function
The above script, transforms the following JSON:
{
\"owningSystemUrl\": \"http://www.arcgis.com\",
\"authInfo\": {
\"tokenServicesUrl\": \"https://www.arcgis.com/sharing/rest/generateToken\",
\"isTokenBasedSecurity\": true
}
}
into:
<xml owningSystemUrl=\"http://www.arcgis.com\">
<authInfo
tokenServicesUrl=\"https://www.arcgis.com/sharing/rest/generateToken\"
isTokenBasedSecurity=\"true\" >
</authInfo>
</xml>
We can now use XPath to extract the tokenServicesUrl
, for example:
dom.SelectSingleNode(\"xml/authInfo\").getAttribute(\"tokenServicesUrl\")
\' Returns: \"https://www.arcgis.com/sharing/rest/generateToken\"
回答7:
AXE is a great library but is rather heavy if you just need JSON processing functionality.
I did, however, grab the base.asp file and the json.asp class file from the AXE project and successfully used them to implement JSON parsing in my project.
For JSON generation, I found aspjson was simpler to integrate. It also has more powerful json-related features. The axe documentation a little lacking and was more work to integrate into the project, however it does do a fine job of serializing its JSON VB object back to a string.
回答8:
the solutions here are very good but sometimes overkill.
If the JSON is simple and always the same structure you can parse it yourself, it\'s fast and simple.
\'read data from client
records = Request.Form(\"records\")
\'convert the JSON string to an array
Set oRegExpre = new RegExp
oRegExpre.Global = true
oRegExpre.Pattern = \"[\\[\\]\\{\\}\"\"]+\"
records = replace(records, \"},{\",\"||\")
records = oRegExpre.Replace(records, \"\" )
aRecords = split(records,\"||\")
\'iterate the array and do some cleanup
for each rec in aRecords
aRecord = split(rec,\",\")
id = split(aRecord(1),\":\")(1)
field = split(aRecord(0),\":\")(0)
updateValue = split(aRecord(0),\":\")(1)
updateValue = replace(updateValue,chr(10),\"\\n\")
updateValue = replace(updateValue,chr(13),\"\\r\")
updateValue = replace(updateValue,\"\'\",\"\'\'\")
\'etc
next