asp使用AspJson转换json数据

asp使用AspJson转换json数据

需要使用json数据的场景很多,那幺asp中如何操作json数据呢?asp与json格式又如何交互呢?本文介绍使用AspJson转换为json格式数据输出,以及解析json数据。

aspJSON1.17.asp文件

%'Februari 2014 - Version 1.17 by Gerrit van KuipersClass aspJSONPublic dataPrivate p_JSONstringprivate aj_in_string, aj_in_escape, aj_i_tmp, aj_char_tmp, aj_s_tmp, aj_line_tmp, aj_line, aj_lines, aj_currentlevel, aj_currentkey, aj_currentvalue, aj_newlabel, aj_XmlHttp, aj_RegExp, aj_colonfound Private Sub Class_Initialize()Set data = Collection() Set aj_RegExp = new regexp aj_RegExp.Pattern = "\s{0,}(\S{1}[\s,\S]*\S{1})\s{0,}" aj_RegExp.Global = False aj_RegExp.IgnoreCase = True aj_RegExp.Multiline = TrueEnd Sub Private Sub Class_Terminate()Set data = Nothing Set aj_RegExp = NothingEnd Sub Public Sub loadJSON(inputsource)inputsource = aj_MultilineTrim(inputsource)If Len(inputsource) = 0 Then Err.Raise 1, "loadJSON Error", "No data to load."select case Left(inputsource, 1)case "{", "["case elseSet aj_XmlHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")aj_XmlHttp.open "GET", inputsource, Falseaj_XmlHttp.setRequestHeader "Content-Type", "text/json"aj_XmlHttp.setRequestHeader "CharSet", "UTF-8"aj_XmlHttp.Sendinputsource = aj_XmlHttp.responseTextset aj_XmlHttp = Nothingend select p_JSONstring = CleanUpJSONstring(inputsource)aj_lines = Split(p_JSONstring, Chr(13) Chr(10)) Dim level(99)aj_currentlevel = 1Set level(aj_currentlevel) = dataFor Each aj_line In aj_linesaj_currentkey = ""aj_currentvalue = ""If Instr(aj_line, ":") 0 Thenaj_in_string = Falseaj_in_escape = Falseaj_colonfound = FalseFor aj_i_tmp = 1 To Len(aj_line)If aj_in_escape Thenaj_in_escape = FalseElseSelect Case Mid(aj_line, aj_i_tmp, 1)Case """"aj_in_string = Not aj_in_stringCase ":"If Not aj_in_escape And Not aj_in_string Thenaj_currentkey = Left(aj_line, aj_i_tmp - 1)aj_currentvalue = Mid(aj_line, aj_i_tmp + 1)aj_colonfound = TrueExit ForEnd IfCase "\"aj_in_escape = TrueEnd SelectEnd IfNextif aj_colonfound thenaj_currentkey = aj_Strip(aj_JSONDecode(aj_currentkey), """")If Not level(aj_currentlevel).exists(aj_currentkey) Then level(aj_currentlevel).Add aj_currentkey, ""end ifEnd IfIf right(aj_line,1) = "{" Or right(aj_line,1) = "[" ThenIf Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).CountSet level(aj_currentlevel).Item(aj_currentkey) = Collection()Set level(aj_currentlevel + 1) = level(aj_currentlevel).Item(aj_currentkey)aj_currentlevel = aj_currentlevel + 1aj_currentkey = ""ElseIf right(aj_line,1) = "}" Or right(aj_line,1) = "]" or right(aj_line,2) = "}," Or right(aj_line,2) = "]," Thenaj_currentlevel = aj_currentlevel - 1ElseIf Len(Trim(aj_line)) 0 Thenif Len(aj_currentvalue) = 0 Then aj_currentvalue = aj_lineaj_currentvalue = getJSONValue(aj_currentvalue) If Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).Countlevel(aj_currentlevel).Item(aj_currentkey) = aj_currentvalueEnd IfNextEnd Sub Public Function Collection()set Collection = Server.CreateObject("Scripting.Dictionary")End Function Public Function AddToCollection(dictobj)if TypeName(dictobj) "Dictionary" then Err.Raise 1, "AddToCollection Error", "Not a collection."aj_newlabel = dictobj.Countdictobj.Add aj_newlabel, Collection()set AddToCollection = dictobj.item(aj_newlabel)end function Private Function CleanUpJSONstring(aj_originalstring)aj_originalstring = Replace(aj_originalstring, Chr(13) Chr(10), "")aj_originalstring = Mid(aj_originalstring, 2, Len(aj_originalstring) - 2)aj_in_string = False : aj_in_escape = False : aj_s_tmp = ""For aj_i_tmp = 1 To Len(aj_originalstring)aj_char_tmp = Mid(aj_originalstring, aj_i_tmp, 1)If aj_in_escape Thenaj_in_escape = Falseaj_s_tmp = aj_s_tmp aj_char_tmpElseSelect Case aj_char_tmpCase "\" : aj_s_tmp = aj_s_tmp aj_char_tmp : aj_in_escape = TrueCase """" : aj_s_tmp = aj_s_tmp aj_char_tmp : aj_in_string = Not aj_in_stringCase "{", "["aj_s_tmp = aj_s_tmp aj_char_tmp aj_InlineIf(aj_in_string, "", Chr(13) Chr(10))Case "}", "]"aj_s_tmp = aj_s_tmp aj_InlineIf(aj_in_string, "", Chr(13) Chr(10)) aj_char_tmpCase "," : aj_s_tmp = aj_s_tmp aj_char_tmp aj_InlineIf(aj_in_string, "", Chr(13) Chr(10))Case Else : aj_s_tmp = aj_s_tmp aj_char_tmpEnd SelectEnd IfNext CleanUpJSONstring = ""aj_s_tmp = split(aj_s_tmp, Chr(13) Chr(10))For Each aj_line_tmp In aj_s_tmpaj_line_tmp = replace(replace(aj_line_tmp, chr(10), ""), chr(13), "")CleanUpJSONstring = CleanUpJSONstring aj_Trim(aj_line_tmp) Chr(13) Chr(10)NextEnd Function Private Function getJSONValue(ByVal val)val = Trim(val)If Left(val,1) = ":" Then val = Mid(val, 2)If Right(val,1) = "," Then val = Left(val, Len(val) - 1)val = Trim(val) Select Case valCase "true" : getJSONValue = TrueCase "false" : getJSONValue = FalseCase "null" : getJSONValue = NullCase ElseIf (Instr(val, """") = 0) ThenIf IsNumeric(val) ThengetJSONValue = CDbl(val)ElsegetJSONValue = valEnd IfElseIf Left(val,1) = """" Then val = Mid(val, 2)If Right(val,1) = """" Then val = Left(val, Len(val) - 1)getJSONValue = aj_JSONDecode(Trim(val))End IfEnd SelectEnd Function Private JSONoutput_levelPublic Function JSONoutput()dim wrap_dicttype, aj_labelJSONoutput_level = 1wrap_dicttype = "[]"For Each aj_label In data If Not aj_IsInt(aj_label) Then wrap_dicttype = "{}"NextJSONoutput = Left(wrap_dicttype, 1) Chr(13) Chr(10) GetDict(data) Right(wrap_dicttype, 1)End Function Private Function GetDict(objDict)dim aj_item, aj_keyvals, aj_label, aj_dicttypeFor Each aj_item In objDictSelect Case TypeName(objDict.Item(aj_item))Case "Dictionary"GetDict = GetDict Space(JSONoutput_level * 4)aj_dicttype = "[]"For Each aj_label In objDict.Item(aj_item).Keys If Not aj_IsInt(aj_label) Then aj_dicttype = "{}"NextIf aj_IsInt(aj_item) ThenGetDict = GetDict (Left(aj_dicttype,1) Chr(13) Chr(10))ElseGetDict = GetDict ("""" aj_JSONEncode(aj_item) """" ": " Left(aj_dicttype,1) Chr(13) Chr(10))End IfJSONoutput_level = JSONoutput_level + 1aj_keyvals = objDict.KeysGetDict = GetDict (GetSubDict(objDict.Item(aj_item)) Space(JSONoutput_level * 4) Right(aj_dicttype,1) aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") Chr(13) Chr(10))Case Elseaj_keyvals = objDict.KeysGetDict = GetDict (Space(JSONoutput_level * 4) aj_InlineIf(aj_IsInt(aj_item), "", """" aj_JSONEncode(aj_item) """: ") WriteValue(objDict.Item(aj_item)) aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") Chr(13) Chr(10))End SelectNextEnd Function Private Function aj_IsInt(val)aj_IsInt = (TypeName(val) = "Integer" Or TypeName(val) = "Long")End Function Private Function GetSubDict(objSubDict)GetSubDict = GetDict(objSubDict)JSONoutput_level= JSONoutput_level -1End Function Private Function WriteValue(ByVal val)Select Case TypeName(val)Case "Double", "Integer", "Long": WriteValue = valCase "Null": WriteValue = "null"Case "Boolean": WriteValue = aj_InlineIf(val, "true", "false")Case Else: WriteValue = """" aj_JSONEncode(val) """"End SelectEnd Function Private Function aj_JSONEncode(ByVal val)val = Replace(val, "\", "\\")val = Replace(val, """", "\""")'val = Replace(val, "/", "\/")val = Replace(val, Chr(8), "\b")val = Replace(val, Chr(12), "\f")val = Replace(val, Chr(10), "\n")val = Replace(val, Chr(13), "\r")val = Replace(val, Chr(9), "\t")aj_JSONEncode = Trim(val)End Function Private Function aj_JSONDecode(ByVal val)val = Replace(val, "\""", """")val = Replace(val, "\\", "\")val = Replace(val, "\/", "/")val = Replace(val, "\b", Chr(8))val = Replace(val, "\f", Chr(12))val = Replace(val, "\n", Chr(10))val = Replace(val, "\r", Chr(13))val = Replace(val, "\t", Chr(9))aj_JSONDecode = Trim(val)End Function Private Function aj_InlineIf(condition, returntrue, returnfalse)If condition Then aj_InlineIf = returntrue Else aj_InlineIf = returnfalseEnd Function Private Function aj_Strip(ByVal val, stripper)If Left(val, 1) = stripper Then val = Mid(val, 2)If Right(val, 1) = stripper Then val = Left(val, Len(val) - 1)aj_Strip = valEnd Function Private Function aj_MultilineTrim(TextData)aj_MultilineTrim = aj_RegExp.Replace(TextData, "$1")End Function private function aj_Trim(val)aj_Trim = Trim(val)Do While Left(aj_Trim, 1) = Chr(9) : aj_Trim = Mid(aj_Trim, 2) : LoopDo While Right(aj_Trim, 1) = Chr(9) : aj_Trim = Left(aj_Trim, Len(aj_Trim) - 1) : Loopaj_Trim = Trim(aj_Trim)end functionEnd Class%

AspJson官方使用方法参考

!--#include virtual="/aspJSON1.17.asp" -- %Set oJSON = New aspJSON 'Load JSON stringoJSON.loadJSON(jsonstring) 'Get single valueResponse.Write oJSON.data("firstName") " br " 'Loop through collectionFor Each phonenr In oJSON.data("phoneNumber") Set this = oJSON.data("phoneNumber").item(phonenr) Response.Write _ this.item("type") ": " _ this.item("number") " br "Next 'Update/Add valueoJSON.data("firstName") = "James" 'Return json stringResponse.Write oJSON.JSONoutput()%

示例一 输出json

!--#include virtual="/aspJSON1.17.asp" -- %Set oJSON = New aspJSONWith oJSON.data .Add "familyName", "Smith" 'Create value .Add "familyMembers", oJSON.Collection() With oJSON.data("familyMembers") .Add 0, oJSON.Collection() 'Create object With .item(0) .Add "firstName", "John" .Add "age", 41 End With .Add 1, oJSON.Collection() With .item(1) .Add "firstName", "Suzan" .Add "age", 38 .Add "interests", oJSON.Collection() 'Create array With .item("interests") .Add 0, "Reading" .Add 1, "Tennis" .Add 2, "Painting" End With End With .Add 2, oJSON.Collection() With .item(2) .Add "firstName", "John Jr." .Add "age", 2.5 End With End WithEnd WithResponse.Write oJSON.JSONoutput() 'Return json string%

示例二 转换为json格式输出

读取数据库中article表数据,转换为json格式数据输出

dim oJSONSet oJSON = New aspJSONsql="Select * From article where IsSelected=1 and getdate() between isnull(showBeginTime,'1900-1-1 00:00:00') and isnull(showEndTime,getdate()) and (','+UserTypeNo+',' like '%," OAUserTypeNo ",%' or UserTypeNo='')" 'response.Write(sql)set rs=server.CreateObject("adodb.recordset")OpenConn : rs.open sql,Conn,1,3dim nn=0With oJSON.datado while not rs.eof .Add n, oJSON.Collection()With .item(n).Add "ID", "" rs("ID") "" .Add "Title", "" rs("Title") "" .Add "IsActivityTime", "" rs("IsActivityTime") "" .Add "activityBeginTime", "" rs("activityBeginTime") "" .Add "activityEndTime", "" rs("activityEndTime") "" 'Create valueEnd Withn=n+1rs.movenextloopEnd WithResponse.Write oJSON.JSONoutput() 'Return json string

示例三 JS读取Json

前端js使用ajax调用后端接口,获取到上面的json数据,解析输出。

var postData="Action=Announce"//alert(postData)digtalMessage="";digtalMessageAll=""; $.ajax({ type: "GET", url: "/OKOA/CN/AjaxInfo.asp", data: postData, success: function(msg){//alert( "Data Saved: " + msg );var obj = jQuery.parseJSON(msg);$.each(obj,function(idx,item){ //alert(item.activityBeginTime) digtalMessage=DigitalTime1(item.Title,item.Title,item.activityBeginTime,item.activityEndTime);digtalMessageAll=digtalMessageAll+" a class=\"Default\" onClick=\"OpenWin('/OKOA/Announce.asp?ID="+item.ID+"','Annonce_"+item.ID+"')\" href=\"#\" "+digtalMessage+" /a ;"})document.getElementById("LiveClock1").innerHTML=digtalMessageAll; }});

总结

asp使用AspJson转换json数据