Bất kỳ thư viện tốt nào để phân tích cú pháp JSON trong ASP Cổ điển? [đóng cửa]


77

Tôi đã có thể tìm thấy hàng triệu thư viện để tạo JSON trong Classic ASP (VBScript) nhưng tôi chưa tìm thấy BẤT KỲ để phân tích cú pháp .

Tôi muốn một thứ gì đó mà tôi có thể chuyển một chuỗi JSON và lấy lại một đối tượng VBScript thuộc một số loại (Array, Scripting.Dictionary, v.v.)

Có ai có thể giới thiệu một thư viện để phân tích cú pháp JSON trong ASP Cổ điển không?


1
Tại sao không tạo một DLL bằng các thư viện .net có sẵn?
Shoban

1
Do giới hạn của máy khách, tôi không thể cài đặt bất kỳ thứ gì trên máy chủ. Tôi hy vọng một cái gì đó là ASP cổ điển thuần túy.
Mark Biek

1
Thực sự, tôi rất vui khi tìm thấy thứ gì đó vừa làm mảng (bao gồm cả đa chiều). Nó sẽ không phải hỗ trợ thông số JSON hoàn chỉnh.
Mark Biek

3
Tôi biết điều này đã cũ nhưng bạn có thể kiểm tra lớp AspJson của tôi. Nó giúp tôi rất nhiều: github.com/rcdmk/aspJSON
Ricardo Souza

Câu trả lời:


92

Hãy nhớ rằng ASP Cổ điển bao gồm JScript cũng như VBScript. Điều thú vị là bạn có thể phân tích cú pháp JSON bằng JScript và sử dụng các đối tượng kết quả trực tiếp trong VBScript.

Do đó, bạn có thể sử dụng https://github.com/douglascrockford/JSON-js/blob/master/json2.js chuẩn trong mã phía máy chủ mà không cần sửa đổi.

Tất nhiên, nếu JSON của bạn bao gồm bất kỳ mảng nào, những mảng này sẽ vẫn là mảng JScript khi quá trình phân tích cú pháp hoàn tất. Bạn có thể truy cập nội dung của mảng JScript từ VBScript bằng cách sử dụng ký hiệu dấu chấm.

<%@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
Thư viện AX đã thực hiện điều này ở đây .
sholsinger

trên thực tế đây là một giải pháp tốt hơn mà sử dụng toàn bộ khuôn khổ
Rafael

6
Trong trường hợp điều này không hiệu quả với bất kỳ ai - tôi phải sử dụng <!--#include file="json2.min.asp"-->thay thế <script>và quấn <% ... %>quanh tệp json2.min.js để tạo json2.min.asp, nếu không, JSONđối tượng không thể truy cập được.
Flash

1
@Andrew nhưng điều đó không yêu cầu thay đổi toàn bộ trang thành JScript thay vì VBScript? Tôi đã thử những gì bạn đề xuất và tôi gặp lỗi biên dịch VBScript khi gặp phải /*.
Keith

3
Cảm ơn bạn đã chỉ cách truy cập các phần tử mảng. Tôi đã dành vài giờ đấu tranh để tìm ra nó và đã bỏ cuộc!
Santosh

16

Không chắc chắn về nó. Bạn đã kiểm tra khung ASP Extreme có hỗ trợ JSON chưa?


Bạn là người hùng của tôi. Điều đó hoạt động hoàn hảo! Tôi sẽ xem qua framework vì nó có vẻ rất tiện dụng nhưng tôi đã có thể nhấc lớp JSON ra và bắt đầu sử dụng nó một mình.
Mark Biek

wow .. Rất vui khi tôi đã có thể giúp bạn ;-)
Shoban

2
Mặc dù vậy, tôi nên đề cập rằng lớp JSON này dường như gặp sự cố với Unicode.
Mark Biek

Chỉ là mẹo cho những ai đang cố gắng đưa tệp json2.asp vào trang vbscript thông qua <script language = "JScript" runat = "server" src = "json2.asp"> </script>, hãy đảm bảo rằng bạn xóa <script language Các thẻ = "Javascript" runat = "server"> và </script> từ json2.asp Trong khi thử nghiệm với bao gồm (mã bao gồm của chúng tôi là v.complex), nó khiến tôi phải vò đầu bứt tai một lúc. Vì vậy, hy vọng nó sẽ giúp ai đó. :-)
Alex KeySmith,

14

Tôi không thể làm cho sự tiến hóa cực đoan hoặc gợi ý của Chris Nielson hoạt động. Nhưng, những điều sau đây đã làm việc cho tôi:

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

Tải xuống phần sau là "json2.min.asp"

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

Thêm dòng sau vào đầu tệp ASP của bạn:

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

Sau đó, bạn có thể sử dụng JSON trong 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

Lưu ý: Để phân tích cú pháp qua một mảng các mục, bạn cần thực hiện như sau:

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

1
Bạn không cần phiên bản JSON2.js có hương vị ASP đặc biệt. Chỉ cần sử dụng bản gốc và tham chiếu nó bằng cách sử dụng srcthuộc tính của <script>thẻ. Xem stackoverflow.com/a/1021848/48082 để biết chi tiết.
Cheeso

8

Gần đây tôi đã triển khai một lớp VbsJson , có phương thức " Giải mã " để phân tích cú pháp JSON thành VBScript và phương thức " Mã hóa " để tạo JSON từ VBScript. Đoạn mã hơi dài nên tôi không dán ở đây.


Tôi đã chuyển đổi các tệp vbs thành asp. Nó hoạt động rất đẹp! Sạch sẽ và đơn giản. Cảm ơn rất nhiều Demon.
Đánh dấu

Đây là giải pháp duy nhất tôi có thể làm việc bằng IIS / IIS Express 8.5. Tôi nghi ngờ rằng đã có những thay đổi đáng kể đối với trình biên dịch ASP khiến nhiều câu trả lời khác đã lỗi thời.
Keith

4

Tôi đã viết câu trả lời này khi tôi đang tìm kiếm một giải pháp VBScript thuần túy nhẹ.

Bằng cách kết hợp một trình chuyển đổi JSON sang XML thô sơ, chúng ta có thể xem chuỗi JSON và biến nó thành tài liệu Microsoft.XMLDOM.

Từ đó, chúng tôi sử dụng API XML của Microsoft bao gồm các truy vấn XPath để lấy ra bất kỳ giá trị nào chúng tôi muốn.

Điều này xử lý JSON đơn giản, nhưng, tôi không bao giờ có ý định trả lời này cho bất kỳ điều gì phức tạp hơn.

Để có một giải pháp mạnh mẽ hơn, trình thông dịch JSON tốt nhất là một công cụ Javascript phù hợp. Do đó, tôi thực sự khuyên bạn nên trả lời được chấp nhận cho câu hỏi này, tức là Bất kỳ thư viện tốt nào để phân tích cú pháp JSON trong ASP Cổ điển?

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

Tập lệnh trên, chuyển đổi JSON sau:

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

thành:

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

Bây giờ chúng ta có thể sử dụng XPath để giải nén tokenServicesUrl, ví dụ:

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

Đó là một ý tưởng thú vị. Cảm ơn!
Mark Biek

1
Tại sao phải chuyển đổi json sang XML ??
Brian White,

@ brian-white suy nghĩ là, một khi nó là XML, bạn có API DOM hoàn chỉnh của Microsoft XML để làm bất cứ điều gì.
Stephen Quan

Chuyển đổi nó thành một lớp :) Sử dụng một số gen mã trên json để tạo một lớp thực và tải nó từ json. Sau đó, bạn có đầy đủ sức mạnh của một ngôn ngữ kịch bản để làm bất cứ điều gì bạn muốn
Brian White


2

AX là một thư viện tuyệt vời nhưng khá nặng nếu bạn chỉ cần chức năng xử lý JSON.

Tuy nhiên, tôi đã lấy tệp base.asp và tệp lớp json.asp từ dự án AX và sử dụng thành công chúng để triển khai phân tích cú pháp JSON trong dự án của tôi.

Đối với thế hệ JSON, tôi thấy aspjson dễ tích hợp hơn. Nó cũng có nhiều tính năng liên quan đến json mạnh mẽ hơn. Tài liệu về rìu hơi thiếu và cần nhiều công việc hơn để tích hợp vào dự án, tuy nhiên, nó thực hiện rất tốt việc tuần tự hóa đối tượng JSON VB của nó trở lại thành một chuỗi.


1
aspjson không phân tích cú pháp JSON, nó chỉ tạo ra nó.
Mark Biek

Điểm tốt - đã cập nhật câu trả lời của tôi để làm rõ
Joe Niland

2

các giải pháp ở đây là rất tốt nhưng đôi khi quá mức cần thiết. Nếu JSON đơn giản và luôn có cấu trúc giống nhau, bạn có thể tự phân tích cú pháp, thì nó rất nhanh và đơn giản.

 '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

Tôi đang cố gắng tìm một thư viện JSON, khi bài đăng của bạn khiến tôi không còn cách tiếp cận KISS. Tôi nhận ra rằng mình sẽ thực sự cần phải phân tích cú pháp một tin nhắn với một định dạng rất rõ ràng. Tôi có thể tự mình cắt và chia nó thành một thứ có thể sử dụng được. Cảm ơn.
alphadogg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.