web-dev-qa-db-ja.com

Classic ASPでJSONを解析するための優れたライブラリはありますか?

生成クラシックのJSON ASP(VBScript)の無数のライブラリを見つけることができましたが、解析のために何も見つかりませんでした

JSON文字列を渡して、何らかのVBScriptオブジェクト(Array、Scripting.Dictionaryなど)を取得できるものが必要です。

誰もがクラシックASPでJSONを解析するためのライブラリを推奨できますか?

72
Mark Biek

Classic 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
%>
84
Chris Nielsen

それについてはわかりません。 ASP extreme JSONをサポートするフレームワークをチェックしましたか?

15
Shoban

私は極端な進化やクリス・ニールソンの提案を得ることができませんでした。しかし、次は私のために働いた:

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
13
seanyboy

最近、 VbsJson クラスを実装しました。このクラスには、JSONをVBScriptに解析するための "Decode"メソッドと "- Encode "VBScriptからJSONを生成するメソッド。コードはやや長いので、ここには貼り付けません。

7
Demon
4
Hasan Köroğlu

軽量で純粋なVBScriptのみのソリューションを探していたときに、この回答を書きました。

初歩的なJSONからXMLへのコンバーターをまとめることで、JSON文字列を調べてMicrosoft.XMLDOMドキュメントに変換できます。

そこから、XPathクエリを含むMicrosoftのXML APIを使用して、必要な値を取り出します。

これは単純な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"
3
Stephen Quan

ここでの解決策は非常に優れていますが、時にはやり過ぎです。 JSONが単純で、常に同じ構造である場合、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
2
peter

AXは優れたライブラリですが、JSON処理機能だけが必要な場合はかなり重いです。

ただし、AXプロジェクトからbase.aspファイルとjson.aspクラスファイルを取得し、それらを使用してプロジェクトにJSON解析を実装することに成功しました。

JSON生成では、 aspjson の方が統合が簡単であることがわかりました。また、より強力なjson関連の機能も備えています。 xのドキュメントは少し不足しており、プロジェクトに統合するための作業が多くありましたが、JSON VBオブジェクトを文字列にシリアル化するという素晴らしい仕事をしています。

2
Joe Niland