2012-08-28 104 views
12

Tôi có một công cụ phát triển nhanh cho hệ thống ERP, chỉ cho phép vbscript. Tôi đang cố gắng tạo một AJAX-Request đơn giản với VBS. Điều đó đã làm việc với "Microsoft.XMLHTTP" -object.Giải mã/mã hóa JSON bằng VBScript

Bước tiếp theo là nhận dữ liệu từ máy chủ web bằng cách sử dụng json. Nhưng trong VBS có vẻ như không có chức năng như "json_decode" oder khác.

Có ai biết giải pháp không? Hoặc là lựa chọn duy nhất để phát triển hàm json của riêng tôi?

+0

Được sử dụng, có vẻ như hoạt động trong trường hợp của tôi: [demon.tw] (http://demon.tw/my-work/vbs-json.html#code) –

Trả lời

8

Vì JSON là một định dạng dữ liệu phân cấp, sử dụng cụm từ thông dụng và phân tách(), như Peter được đề xuất, sẽ không giúp bạn đạt được nhiều.

Nếu môi trường của bạn cho phép CreateObject() bạn có thể sử dụng COMponent đã sẵn sàng được viết bằng ngôn ngữ khác (ví dụ: bọc json2.js chuẩn trong .WSC hoặc COM bật .NET DLL). Một tùy chọn khác là khai thác một ngôn ngữ khác thông qua Microsoft Script Control. Con của phương pháp này là bạn sẽ phải đối phó với các đối tượng/mảng được cung cấp bởi ngôn ngữ khác (một số gợi ý được tìm thấy trong chủ đề mà Peter đề cập đến).

Một giải pháp VBScript thuần túy có thể được tìm thấy here. Tôi không thể đọc tài liệu, nhưng mã biên dịch và 'hoạt động' cho các trường hợp thử nghiệm đơn giản - YMMV.

+0

Giải pháp từ demon.tw hoạt động tuyệt vời nhưng hiệu suất rất chậm. Tôi đã có một "mảng" đơn giản với 10-15 giá trị đơn giản. Một mảng duy nhất chứa thông tin của một sản phẩm. Tôi có 3500 sản phẩm, vì vậy tôi phải chạy 3500 lần mã hóa JSON. Đối với tác vụ này, nhiệm vụ này mất 2-3 phút. Nếu không có JSON-Encoding nó chạy nhanh, nhưng tôi sẽ cần định dạng JSON này. Có khả năng tăng tốc nó không? 30 giây sẽ được chấp nhận. –

+0

Tôi đã giải quyết được vấn đề bằng cách xây dựng Cú pháp JSON theo cách thủ công. Tôi vừa mới tham gia các chuỗi và bọc chúng bằng JSON-Cú pháp và thoát khỏi một số ký tự đặc biệt. Vì vậy, hiệu suất là rất tốt - và hoạt động trong trường hợp của tôi. –

+0

_e.g. bọc json2.js chuẩn trong một .WSC hoặc COM bật a.NET DLL_ Bạn có thể vui lòng chỉ cho tôi tới trang web hoặc bất kỳ tài liệu hướng dẫn nào về cách thực hiện không? – Gurman

0

Bạn nên tự mình triển khai dựa trên truy vấn tại đây trên json và asp. Ví dụ: Any good libraries for parsing JSON in Classic ASP? Hầu hết thời gian thư viện json2 được sử dụng nhưng điều này dựa trên jscript nên không có tùy chọn cho bạn. Ngoài ra hầu hết thời gian loại JSON này có cấu trúc cố định nên không khó để phân tích cú pháp với Regularexpression như tôi đã trình bày trong một số câu trả lời giống như câu trả lời ở trên. Bạn có thể xuất bản một số JSON của mình để chúng tôi có thể kiểm tra nó bằng một số quy trình.

3

Tôi đã có một vấn đề tương tự vì vậy tôi đã viết một hàm JSONtoXML trong VBScript cho một trong các dự án của tôi. Không bảo đảm về tập lệnh này (nó được cung cấp như là và đã biết các giới hạn như không xử lý tất cả các loại trình tự thoát):

Const stateRoot = 0 
Const stateNameQuoted = 1 
Const stateNameFinished = 2 
Const stateValue = 3 
Const stateValueQuoted = 4 
Const stateValueQuotedEscaped = 5 
Const stateValueUnquoted = 6 
Const stateValueUnquotedEscaped = 7 

Function JSONToXML(json) 
    Dim dom, xmlElem, i, ch, state, name, value 
    Set dom = CreateObject("Microsoft.XMLDOM") 
    state = stateRoot 
    For i = 1 to Len(json) 
    ch = Mid(json, i, 1) 
    Select Case state 
    Case stateRoot 
     Select Case ch 
     Case "[" 
     If dom.documentElement is Nothing Then 
      Set xmlElem = dom.CreateElement("ARRAY") 
      Set dom.documentElement = xmlElem 
     Else 
      Set xmlElem = XMLCreateChild(xmlElem, "ARRAY") 
     End If 
     Case "{" 
     If dom.documentElement is Nothing Then 
      Set xmlElem = dom.CreateElement("OBJECT") 
      Set dom.documentElement = xmlElem 
     Else 
      Set xmlElem = XMLCreateChild(xmlElem, "OBJECT") 
     End If 
     Case """" 
     state = stateNameQuoted 
     name = "" 
     Case "}" 
     Set xmlElem = xmlElem.parentNode 
     Case "]" 
     Set xmlElem = xmlElem.parentNode 
     End Select 
    Case stateNameQuoted 
     Select Case ch 
     Case """" 
     state = stateNameFinished 
     Case Else 
     name = name + ch 
     End Select 
    Case stateNameFinished 
     Select Case ch 
     Case ":" 
     value = "" 
     State = stateValue 
     End Select 
    Case stateValue 
     Select Case ch 
     Case """" 
     State = stateValueQuoted 
     Case "{" 
     Set xmlElem = XMLCreateChild(xmlElem, "OBJECT") 
     State = stateRoot 
     Case "[" 
     Set xmlElem = XMLCreateChild(xmlElem, "ARRAY") 
     State = stateRoot 
     Case " " 
     Case Chr(9) 
     Case vbCr 
     Case vbLF 
     Case Else 
     value = ch 
     State = stateValueUnquoted 
     End Select 
    Case stateValueQuoted 
     Select Case ch 
     Case """" 
     xmlElem.setAttribute name, value 
     state = stateRoot 
     Case "\" 
     state = stateValueQuotedEscaped 
     Case Else 
     value = value + ch 
     End Select 
    Case stateValueQuotedEscaped ' @@TODO: Handle escape sequences 
     value = value + ch 
     state = stateValueQuoted 
    Case stateValueUnquoted 
     Select Case ch 
     Case "}" 
     xmlElem.setAttribute name, value 
     Set xmlElem = xmlElem.parentNode 
     state = stateRoot 
     Case "]" 
     xmlElem.setAttribute name, value 
     Set xmlElem = xmlElem.parentNode 
     state = stateRoot 
     Case "," 
     xmlElem.setAttribute name, value 
     state = stateRoot 
     Case "\" 
     state = stateValueUnquotedEscaped 
     Case Else 
     value = value + ch 
     End Select 
    Case stateValueUnquotedEscaped ' @@TODO: Handle escape sequences 
     value = value + ch 
     state = stateValueUnquoted 
    End Select 
    Next 
    Set JSONToXML = dom 
End Function 

Function XMLCreateChild(xmlParent, tagName) 
    Dim xmlChild 
    If xmlParent is Nothing Then 
    Set XMLCreateChild = Nothing 
    Exit Function 
    End If 
    If xmlParent.ownerDocument is Nothing Then 
    Set XMLCreateChild = Nothing 
    Exit Function 
    End If 
    Set xmlChild = xmlParent.ownerDocument.createElement(tagName) 
    xmlParent.appendChild xmlChild 
    Set XMLCreateChild = xmlChild 
End Function 
+0

Cảm ơn chức năng tuyệt vời Stephen. Vui lòng xem lại dự án dưới đây bắt nguồn từ ý tưởng của bạn. https://github.com/pravynandas/JSONToXML – PravyNandas

8

Làm thế nào về việc này với ASPJSON?
liệu sẵn có từ http://www.aspjson.com/

Tôi về để sử dụng như một giải pháp cho một trang web rất cũ để gửi một cuộc gọi ajax (sử dụng Jquery) với các dữ liệu được mã hóa để một MongoDB, để thử nghiệm.

+1

Đây là giải pháp tốt nhất, làm việc của nó grate và hiệu suất là tốt. –

0

Check-out https://github.com/rcdmk/aspJSON

Không chắc nếu điều này có bất kỳ mối quan hệ với www.ASPJSON.com (nay không còn tồn tại) đề cập trong câu trả lời của Logan.

Các vấn đề liên quan