當前位置:成語大全網 - 新華字典 - 純lua判斷壹個字符串是否是標準的json格式。

純lua判斷壹個字符串是否是標準的json格式。

樓主指的是這個:網頁鏈接

最近發現在解碼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”來判斷格式。如果妳有,