最近發現在解碼json字符串的時候,如果json字符串本身的格式不對,程序就會報錯,這當然是不能忍受的。於是我休息了壹周寫,終於寫了壹個比較完整的純lua腳本來判斷json字符串。
因為json的應用並不廣泛,剛開始只是學習了以下幾種格式:{"a": "1 "," b": "2 "," c": "3"},還有壹些比較復雜的:{?"鏈接":[
{ ?" a": "1 "," b": "2" },
{?" c": "3 "," d": "4 "
}]},對於這種,我壹開始想處理的方式是找[...]然後攔截它,然後找到{...}然後找到逗號“,”,截取逗號的前部和後部,用string.gsub判斷這個小段是否是“a”的格式:“1”。源代碼如下,後面是處理無限嵌套json的源代碼。
-判斷是不是json。
函數ifIsJson(jsonString)
本地負責人
本地pos1,pos2
jsonString =jsonString:atrim()
本地字符串1 = string sub(JSON string,1,1)?-最外面的支架
local string 2 = string . sub(JSON string,#jsonString)
如果String1=="{ "且String2 =="} "則
String1=jsonString
JSON string = string . sub(JSON string,2,-2)?-拆下最外面的支架
pos1,_=string.find(jsonString," %[")?
如果pos1,則
pos2,_ = string.find(jsonString," %]")
如果pos2,則
head=string.sub(jsonString,2,pos1-1)
local a,b=string.gsub(head,"(\"-)(。-)(\"-):","")
如果a == " "且b==1,則
head=string.sub(jsonString,pos1+1,pos2-1)
雖然真實如此
if (pos2)==#jsonString那麽?-沒有後續行動
局部結果= ContinueCheck(head)?-[中的傳入內容
如果結果為真,則返回真,否則返回假結束
Else - and
局部結果= ContinueCheck(head)?-[中的傳入內容
如果結果==假,則返回假結束
JSON STRING = STRING . sub(JSON STRING,POS2+1,# JSON STRING)-記錄後面的部分。
pos1,_=string.find(jsonString," %[")?
如果pos1,則
pos2,_ = string.find(jsonString," %]")
如果pos2,則
head=string.sub(jsonString,2,pos1-1)
local a,b=string.gsub(head,"(\"-)(。-)(\"-):","")
如果a ~= " "和b~=1那麽返回false end?-“頭”:[{....},{.....},{.....}] ?頭的格式不正確。
head=string.sub(jsonString,pos1+1,pos2-1)?-在下壹個循環中傳遞的參數。
其他
返回錯誤-缺失]
結束
其他
返回false-[]缺少[]
結束
結束
結束
其他
返回false - "head":[{....},{.....},{.....}] ?頭的格式不正確。
結束
其他
返回false?-不匹配[]
結束
Else -不帶括號的簡單single {}json處理。
本地結果=ContinueCheck(String1)
如果結果為真,則返回真,否則返回假結束
結束
其他
返回false?-不匹配{}
結束
結束
函數連續檢查(jsonString)
本地字符串長度=#jsonString
本地pos1,pos2=0,0
本地JsonTable={}
本地i=1
while (true) do?-攔截{...}並存儲在JsonTable中。
pos1,_=string.find(jsonString," { ",pos1+1)
如果pos1,則
pos2,_=string.find(jsonString," } ",pos2+1)
如果pos2,則
JSON table[I]= string . sub(JSON string,pos1+1,pos2-1)
其他
返回false
結束
其他
返回false
結束
如果pos2==#jsonString那麽break end?
i=i+1
結束
本地a、b
局部j=1
雖然(真的)做
jsonString=JsonTable[j]?-壹個壹個檢查。
雖然(真的)做
local q,_=string.find(jsonString,",")
如果q ~ = nilsthen-" a ":" I "," b": "j "求它們之間的逗號。
local JSON string 2 = string . sub(JSON string,1,q-1)?-,在數字之前
JSON string = string . sub(JSON string,q+1,#jsonString)?-,在數字之後
a,b=string.gsub(jsonString2,"(\"-)(。-)(\"-):","")
不然呢?-如果不是,那就是最後壹個關鍵:價值。
a,b=string.gsub(jsonString,"(\"-)(。-)(\"-):","")
結束
如果?b==1那麽?
a,b=string.gsub(a,"(\"-)(。+)(\"+)","")
如果a== " "?然後
mSleep(10)
其他
a=tonumber(a)
如果type(a)= = number,則
mSleep(10)
其他
返回false
結束
結束
其他
返回false
結束
如果q == nil,那麽-找到最後壹個
破裂
結束
結束
如果j==i,則返回true end
j=j+1
結束
結束
其中,msleep只是在等待封裝。可以看出這個寫法會嵌套超級層,只有我的格式規範正確才清楚。不過如上所述做壹個簡單的json判斷是沒有問題的,但是後面考慮如果json是嵌套的並且總是嵌套有[...]和{...},很明顯,這種攔截和判斷的方法來自{...}從前到後不實用,然後多拍幾張。
函數ifIsJson(JsonString)
本地pos1,pos2,pos3,pos4=0,0,0,0
本地計數器1,計數器2,計數器3,計數器4=0,0,0,0
本地字符串1,字符串2
本地Mytable,Mytable2={},{}
局部I,j=1,1
JsonString=JsonString:atrim()
string 1 = string sub(JSON string,1,1)
string2=string.sub(JsonString,-1,-1)
如果string1 = = "{ "和string2 = = "} "那麽-檢查各種括號是否成對存在。
_,pos 1 = string . gsub(JSON string," { "," { "?
_,pos2=string.gsub(JsonString," } "," } ")
_,pos3=string.gsub(JsonString," %[","[")
_,pos4=string.gsub(JsonString," %]","]")
如果pos1~=pos2或pos3~=pos4,則返回false end
否則返回假結束
雖然(真的)做
Pos1,POS2 = string.find (JSON string,",% [{ ",POS1)-find,[{找到它並找到它}]
如果pos1,則
pos3,pos4=string.find(JsonString," }]",pos4)
如果pos3,那麽
string 1 = string . sub(JSON string,pos1,pos4)
_,counter 1 = string . gsub(string 1," { "," { "?-檢查各種括號是否成對存在。
_,counter 2 = string . gsub(string 1," } "," } ")
_,counter 3 = string . gsub(string 1," %[","[")
_,counter 4 = string . gsub(string 1," %]","]")
如果計數器1 ==計數器2且計數器3==計數器4,則
my table[I]= string . sub(JSON string,pos2,pos3) - {....}
i=i+1
string 1 = string sub(JSON string,1,pos1-1)
string2=string.sub(JsonString,pos4+1)
JSON STRING = STRING1..string 2-移除,{[..}]
pos4=pos1
結束
否則返回假結束
不然呢?
pos1,pos2,pos3,pos4=1,1,1,1
Pos1,pos2 = string.find (JSON string," %[{ "-find[{ find after find }]如果不是,則跳出。
如果pos1,則
pos3,pos4=string.find(JsonString," }]")
如果pos3,那麽
string 1 = string . sub(JSON string,pos1,pos4)
_,counter 1 = string . gsub(string 1," { "," { "?-檢查各種括號是否成對存在。
_,counter 2 = string . gsub(string 1," } "," } ")
_,counter 3 = string . gsub(string 1," %[","[")
_,counter 4 = string . gsub(string 1," %]","]")
如果計數器1 ==計數器2且計數器3==計數器4,則
my table[I]= string . sub(JSON string,pos2,pos3) - {....}
i=i+1
string 1 = string sub(JSON string,1,pos1-1)
string2=string.sub(JsonString,pos4+1)
JSON STRING = STRING1.."\" \ "..string 2-移除,[{..}]
pos4=pos1
結束
否則返回假結束
否則中斷結束
結束
結束
i=i-1
如果Mytable[i]~= nil,則
pos1,pos2,pos3,pos4=1,1,1,1
while (true) do?-截取最裏面的[{...}]的嵌套N層。
復讀?-在表[]中找到[{的最後壹個符號,
pos1,pos2=string.find(Mytable[i]," %[{ ",pos2)
如果pos1那麽pos3,pos4=pos1,pos2?結束
直到pos1==nil
pos1,pos2=string.find(Mytable[i]," }]",pos4)?-在字符串中找到pos4後面前面的符號。
如果pos1,則
my table 2[j]= string . sub(my table[I],pos4,pos1) - [ {....} ]
j=j+1
string 1 = string sub(my table[I],1,pos3-1)
stir ng 2 = string sub(my table[I],pos2+1)
Mytable[i]=string1.."\"\""..字符串2
不然呢?
Mytable2[j]=Mytable[i]
j=j+1
i=i-1
如果i== 0,則中斷end -直到找不到對[{0}]。
結束
pos2=1
結束
結束
Mytable2[j]=JsonString
i=1
Mytable={}
pos1,pos2,pos3,pos4=0,0,1,1
雖然(真的)做
重復
pos1,_=string.find(Mytable2[j]," { ",pos2+1)
如果pos1,那麽pos2=pos1結束
直到pos1 == nil?
pos3,_=string.find(Mytable2[j]," } ",pos2)
如果pos3和pos2~=1,則
my table[I]= string . sub(my table 2[j],pos2,pos3) -?{...}
i=i+1
string 1 = string sub(my table 2[j],1,pos2-1)
string2=string.sub(Mytable2[j],pos3+1)
Mytable2[j]=string1.."\"\""..字符串2
其他
my table[I]= string sub(my table 2[j],1,pos3)
i=i+1
j=j-1
如果j==0,則中斷結束
結束
pos2=0
-字符串b攔截?{ ?" id ":" 243125 B4-5c F9-4ad 9-827 b-37698 F6 b98f 0 " }?這種格式存儲在表[j]中
-還剩壹個“圖像”:{“ID”:“243125 B4-5 cf9-4ad 9-827 b-37698 F6 b98f 0”,“A”:“E0”,“D”:“2431-F6 b98f。
結束
i=i-1
對於n=1,我願意?-刪除{}
my table[n]= string sub(my table[n],2,-2)
結束
雖然(真的)做
pos1,_=string.find(Mytable[i],",")
如果pos 1 ~ = nilsthen-" a ":" I "," b": "j "求它們之間的逗號。
string 1 = string sub(my table[I],1,POS1-1),在之前
my table[I]= string sub(my table[I],pos1+1)
pos2,_=string.find(string1," \ " ")
如果pos2==1,則
pos3,pos4=string.find(string1," \ ":",2)
如果pos3,那麽
string 2 = string . sub(string 1,pos4+1)
不然呢?
-(“發現錯誤1”,1)
返回false
結束
不然呢?
-(“發現錯誤2”,1)
返回false
結束
其他
pos2,_=string.find(Mytable[i]," \ ")
如果pos2==1,則
pos3,pos4=string.find(Mytable[i]," \ ":",2)
如果pos3,那麽
string2=string.sub(Mytable[i],pos4+1)
其他
-(“發現錯誤3”,1)
返回false
結束
不然呢?
-(“發現錯誤4”,1)
返回false
結束
結束
pos2,pos3=string.gsub(string2,"(\"-)(。+)(\"+)","")
如果pos2== " "或pos2 == "null ",則
-(“此字符串格式正確”,2)
其他
pos2=tonumber(pos2)
如果type(pos 2)= = number,則
-(“此字符串格式正確2”,2)
其他
-(“發現錯誤5”,1)
返回false
結束
結束
如果pos1== nil,則
i=i-1
如果i==0,則返回true end
結束
結束
結束
這裏有壹個非常核心的思想,既然是無限嵌套,就必須判斷,所以腳本需要做的就是得到最裏面的單層結構的json。朱波找到這個位置後的最後壹個[sum {,然後找到最近的]和},仍然用逗號截取最小的部分“a”:“1”來判斷格式。如果妳有,