123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <%
- '
- ' 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 = """" & jsEncode(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
- %>
|