在经典ASP中有什么好的解析JSON的库吗?[关闭]


76

我已经找到了无数的库来在Classic ASP(VBScript)中生成JSON,但是我还没有找到任何要解析的库

我想要一些可以传递JSON字符串并获取某种VBScript对象(数组,Scripting.Dictionary等)的东西

谁能推荐一个用于在经典ASP中解析JSON的库?


1
为什么不使用可用的.net库创建DLL?
Shoban

1
由于客户端的限制,我无法在服务器上安装任何软件。我希望有一些纯粹的Classic ASP。
Mark Biek 09年

1
真的,我很乐意找到一些能做数组的东西(包括多维的)。它不必支持完整的JSON规范。
Mark Biek 09年

3
我知道这很旧,但是您可以检查我的AspJson类。它确实对我有很大帮助:github.com/rcdmk/aspJSON
Ricardo Souza

Answers:


90

请记住,经典ASP包括JScript和VBScript。有趣的是,您可以使用JScript解析JSON,然后直接在VBScript中使用生成的对象。

因此,可以在零修改的服务器端代码中使用规范的https://github.com/douglascrockford/JSON-js/blob/master/json2.js

当然,如果您的JSON包含任何数组,则在解析完成后,这些数组将保留为JScript数组。您可以使用点表示法从VBScript访问JScript数组的内容。

<%@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
%>

5
AX库已在此处实现。
sholsinger 2011年

实际上,这是使用整个框架的更好解决方案
Rafael11年

6
万一这对任何人都不起作用-我必须使用<!--#include file="json2.min.asp"-->代替<script>,并包装<% ... %>json2.min.js文件以创建json2.min.asp,否则该JSON对象将不可访问。
Flash

1
@Andrew,但这不要求将整个页面更改为JScript而不是VBScript吗?我尝试了您的建议,遇到时遇到了VBScript编译错误/*
基思

3
感谢您展示如何访问数组元素。我花了几个小时奋斗去解决它,然后放弃了!
桑托什,2016年

16

不确定。您是否检查了具有JSON支持的ASP Extreme Framework?


你是我的英雄。很好用!我将看一下该框架,因为它似乎非常方便,但是我能够提出JSON类并开始单独使用它。
Mark Biek 09年

哇..很高兴我能够为您提供帮助;-)
Shoban

2
我应该提一下,这个JSON类似乎在Unicode方面遇到了麻烦。
马克·比耶克(09年

对于那些试图通过<script language =“ JScript” runat =“ server” src =“ json2.asp”> </ script>在vbscript页面中包含json2.asp文件的人来说,确保您删除了<script语言json2.asp中的=“ Javascript” runat =“ server”>和</ script>标记在尝试包含(我们的包含代码为v.complex)时,我花了一段时间。因此希望它对某人有帮助。:-)
Alex KeySmith 2011年

14

我无法接受极端进化或克里斯·尼尔森的建议。但是,以下对我有用:

http://tforster.wik.is/ASP_Classic_Practices_For_The_21st_Century/JSON4ASP

将以下内容下载为“ json2.min.asp”

http://tforster.wik.is/@api/deki/files/2/=json2.min.asp

将以下行添加到您的ASP文件的顶部:

<script language="javascript" runat="server" src="json2.min.asp"></script>

然后,您可以在ASP中使用JSON。

   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

注意:要解析一系列项目,您需要执行以下操作:

   for each iTmp in testing
       if (TypeName(iTmp))<>"JScriptTypeInfo" then 
           Response.Write("Item: " &  iTmp & "<br/>")
       end if
   next

1
您不需要特殊的ASP风格的JSON2.js版本。只需使用原始文件,然后使用标签的src属性对其进行引用即可<script>。有关详细信息,请参见stackoverflow.com/a/1021848/48082
Cheeso 2012年

8

我最近实现了一个VbsJson类,该类具有用于将JSON解析为VBScript的“ Decode ”方法和用于从VBScript生成JSON的“ Encode ”方法。代码有点长,所以我不在这里粘贴。


我将vbs文件转换为asp。它工作得很漂亮!干净简单。非常感谢Demon。
2013年

这是我使用IIS / IIS Express 8.5可以使用的唯一解决方案。我怀疑ASP编译器已发生重大变化,使许多其他答案已过时。
基思


3

我在寻找仅重量轻的纯VBScript解决方案时写了这个答案。

通过将基本的JSON转换为XML转换器,我们可以遍历JSON字符串并将其转换为Microsoft.XMLDOM文档。

从那里开始,我们使用Microsoft的XML API(包括XPath查询)提取所需的任何值。

这可以处理简单的JSON,但是,我从未打算将此答案用于更复杂的事情。

对于更健壮的解决方案,最好的JSON解释器是适当的Javascript引擎。因此,我强烈建议您接受该问题的答案,即在Classic ASP中是否有任何用于解析JSON的好的库?

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

上面的脚本将转换以下JSON:

{
  "owningSystemUrl": "http://www.arcgis.com",
  "authInfo": {
    "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
    "isTokenBasedSecurity": true
  }
}

变成:

<xml owningSystemUrl="http://www.arcgis.com">
    <authInfo
        tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
        isTokenBasedSecurity="true" >
    </authInfo>
</xml>

现在,我们可以使用XPath提取tokenServicesUrl,例如:

dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
' Returns: "https://www.arcgis.com/sharing/rest/generateToken"

这是一个有趣的想法。谢谢!
Mark Biek 2012年

为什么要将json转换为XML?
布莱恩·怀特

@ brian-white的想法是,一旦是XML,您便拥有了完整的Microsoft XML DOM的API,可以执行任何操作。
Stephen Quan

将其转换为类:)在json上使用一些代码生成一个真实的类,并从json加载该类。然后,您将拥有脚本语言的全部功能来完成您想做的一切
Brian White,

2

AX是一个很棒的库,但是如果您只需要JSON处理功能,则它会很繁重。

但是,我确实从AX项目中获取了base.asp文件和json.asp类文件,并成功地使用它们在我的项目中实现了JSON解析。

对于JSON生成,我发现aspjson易于集成。它还具有更强大的json相关功能。斧头文档有点缺乏,并且需要更多的工作来集成到项目中,但是它确实很好地完成了将JSON VB对象序列化回字符串的工作。


1
aspjson不会解析JSON,它只会生成它。
Mark Biek 2011年

好点-更新我的答案以澄清
Joe Niland

2

这里的解决方案非常好,但有时会过大。如果JSON很简单并且始终具有相同的结构,您可以自己解析它,那么它既快速又简单。

 '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

当您的帖子使我远离非KISS方法时,我正试图找到一个JSON库。我意识到我真的需要解析一种格式非常明确的消息。我可以将其切成可用的东西。谢谢。
alphadogg 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.