210 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| <%
 | |
| '
 | |
| '	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
 | |
| %> |