Created
March 23, 2012 14:20
-
-
Save galba/2171058 to your computer and use it in GitHub Desktop.
asp json vbs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<% | |
' | |
' VBS JSON 2.0.3 | |
' Copyright (c) 2009 Tuðrul Topuz | |
' Under the MIT (MIT-LICENSE.txt) license. | |
' | |
Const JSON_OBJECT = 0 | |
Const JSON_ARRAY = 1 | |
Class jsCore | |
Public Collection | |
Public Count | |
Public QuotedVars | |
Public Kind ' 0 = object, 1 = array | |
Private Sub Class_Initialize | |
Set Collection = CreateObject("Scripting.Dictionary") | |
QuotedVars = True | |
Count = 0 | |
End Sub | |
Private Sub Class_Terminate | |
Set Collection = Nothing | |
End Sub | |
' counter | |
Private Property Get Counter | |
Counter = Count | |
Count = Count + 1 | |
End Property | |
' - data maluplation | |
' -- pair | |
Public Property Let Pair(p, v) | |
If IsNull(p) Then p = Counter | |
Collection(p) = v | |
End Property | |
Public Property Set Pair(p, v) | |
If IsNull(p) Then p = Counter | |
If TypeName(v) <> "jsCore" Then | |
Err.Raise &hD, "class: class", "Incompatible types: '" & TypeName(v) & "'" | |
End If | |
Set Collection(p) = v | |
End Property | |
Public Default Property Get Pair(p) | |
If IsNull(p) Then p = Count - 1 | |
If IsObject(Collection(p)) Then | |
Set Pair = Collection(p) | |
Else | |
Pair = Collection(p) | |
End If | |
End Property | |
' -- pair | |
Public Sub Clean | |
Collection.RemoveAll | |
End Sub | |
Public Sub Remove(vProp) | |
Collection.Remove vProp | |
End Sub | |
' data maluplation | |
' encoding | |
Function jsEncode(str) | |
Dim charmap(127), haystack() | |
charmap(8) = "\b" | |
charmap(9) = "\t" | |
charmap(10) = "\n" | |
charmap(12) = "\f" | |
charmap(13) = "\r" | |
charmap(34) = "\""" | |
charmap(47) = "\/" | |
charmap(92) = "\\" | |
Dim strlen : strlen = Len(str) - 1 | |
ReDim haystack(strlen) | |
Dim i, charcode | |
For i = 0 To strlen | |
haystack(i) = Mid(str, i + 1, 1) | |
charcode = AscW(haystack(i)) And 65535 | |
If charcode < 127 Then | |
If Not IsEmpty(charmap(charcode)) Then | |
haystack(i) = charmap(charcode) | |
ElseIf charcode < 32 Then | |
haystack(i) = "\u" & Right("000" & Hex(charcode), 4) | |
End If | |
Else | |
haystack(i) = "\u" & Right("000" & Hex(charcode), 4) | |
End If | |
Next | |
jsEncode = Join(haystack, "") | |
End Function | |
' converting | |
Public Function toJSON(vPair) | |
Select Case VarType(vPair) | |
Case 0 ' Empty | |
toJSON = "null" | |
Case 1 ' Null | |
toJSON = "null" | |
Case 7 ' Date | |
' toJSON = "new Date(" & (vPair - CDate(25569)) * 86400000 & ")" ' let in only utc time | |
toJSON = """" & CStr(vPair) & """" | |
Case 8 ' String | |
toJSON = """" & CStr(vPair) & """" | |
Case 9 ' Object | |
Dim bFI,i | |
bFI = True | |
If vPair.Kind Then toJSON = toJSON & "[" Else toJSON = toJSON & "{" | |
For Each i In vPair.Collection | |
If bFI Then bFI = False Else toJSON = toJSON & "," | |
If vPair.Kind Then | |
toJSON = toJSON & toJSON(vPair(i)) | |
Else | |
If QuotedVars Then | |
toJSON = toJSON & """" & i & """:" & toJSON(vPair(i)) | |
Else | |
toJSON = toJSON & i & ":" & toJSON(vPair(i)) | |
End If | |
End If | |
Next | |
If vPair.Kind Then toJSON = toJSON & "]" Else toJSON = toJSON & "}" | |
Case 11 | |
If vPair Then toJSON = "true" Else toJSON = "false" | |
Case 12, 8192, 8204 | |
toJSON = RenderArray(vPair, 1, "") | |
Case Else | |
toJSON = Replace(vPair, ",", ".") | |
End select | |
End Function | |
Function RenderArray(arr, depth, parent) | |
Dim first : first = LBound(arr, depth) | |
Dim last : last = UBound(arr, depth) | |
Dim index, rendered | |
Dim limiter : limiter = "," | |
RenderArray = "[" | |
For index = first To last | |
If index = last Then | |
limiter = "" | |
End If | |
On Error Resume Next | |
rendered = RenderArray(arr, depth + 1, parent & index & "," ) | |
If Err = 9 Then | |
On Error GoTo 0 | |
RenderArray = RenderArray & toJSON(Eval("arr(" & parent & index & ")")) & limiter | |
Else | |
RenderArray = RenderArray & rendered & "" & limiter | |
End If | |
Next | |
RenderArray = RenderArray & "]" | |
End Function | |
Public Property Get jsString | |
jsString = toJSON(Me) | |
End Property | |
Sub Flush | |
If TypeName(Response) <> "Empty" Then | |
Response.Write(jsString) | |
ElseIf WScript <> Empty Then | |
WScript.Echo(jsString) | |
End If | |
End Sub | |
Public Function Clone | |
Set Clone = ColClone(Me) | |
End Function | |
Private Function ColClone(core) | |
Dim jsc, i | |
Set jsc = new jsCore | |
jsc.Kind = core.Kind | |
For Each i In core.Collection | |
If IsObject(core(i)) Then | |
Set jsc(i) = ColClone(core(i)) | |
Else | |
jsc(i) = core(i) | |
End If | |
Next | |
Set ColClone = jsc | |
End Function | |
End Class | |
Function jsObject | |
Set jsObject = new jsCore | |
jsObject.Kind = JSON_OBJECT | |
End Function | |
Function jsArray | |
Set jsArray = new jsCore | |
jsArray.Kind = JSON_ARRAY | |
End Function | |
Function toJSON(val) | |
toJSON = (new jsCore).toJSON(val) | |
End Function | |
%> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment