使用lkjson处理Json数据
最近项目中要使用Json交换数据,曾有印象Delphi2009的宣传文章中已经支持Json了,我想2010中应该也会有吧。用Json这个词在安装目录搜索了一番,却只找到DBXJSON和DBXJSONReflect,从名字上看就已经很失望了。但还是不死心,于是进去看看源代码。果然只是给DataSnap准备的。
既然官方不支持,只能自谋生路了,看过万一老师推荐的JSON – SuperObject v1.1应该也是不错的东西,不过我不太喜欢接口调用,就没有仔细去看了。
Json的官方网站上也列出了一个For Delphi的库,名字是:lkjson( 官方网站 )。于是下载下来,大致看了一下代码很轻量。
由于刚入手还不了解,简单说一下使用方法:
1,载入
var Jso: TlkJSONbase;
begin
Jso:=TlkJSON.ParseText(Memo1.Text);
从字符串中载入Json,并返回一个TlkJSONbase对象,当然使用完毕后记得释放掉它。
2,节点处理
TlkJSONbase是所有Json总类的父类,通过它的SelfType方法可以获取节点的类型,然后根据类型把它转化成相应的类去操作。
例如 (Json as TlkJSONObject)
下面列出全部的类型与操作说明:
jsBase
值对类型。相关类:TlkJSONobjectmethod。
(Json as TlkJSONobjectmethod).Name: 节点的名称
(Json as TlkJSONobjectmethod).ObjValue: 节点的值,注意ObjValue的类型还是TlkJSONbase依然需要用SelfType来判断具体类型。
jsList,
数组类型。相关类:TlkJSONlist
(Json as TlkJSONlist).Count:获取数组的长度。
(Json as TlkJSONlist).IndexOf(n): 获取数组的第N个元素,返回值依然是TlkJSONbase。
jsObject
对象类型。相关类:TlkJSONObject。
(Json as TlkJSONObject).Name: 获取属性的长度
(Json as TlkJSONObject).IndexOfName('N'): 获取名为N的属性的值,返回值依然是TlkJSONbase。
jsNumber,
整数或浮点数,可以用Value来直接获取,不用转化类了。
jsString,
字符串。同上。
jsBoolean,
布尔值,同上。
jsNull,
空值,同上。
3,介于以上理解为了加深印象我写了一个简单的json格式化函数。
uses uLkJSON; function FormatJson(Jso: TlkJSONbase; Level:Integer): String; var I:Integer; begin if Jso is TlkJSONobjectmethod then begin with TlkJSONobjectMethod(Jso) do begin Result:='"'+Name+'" : '; Jso:=ObjValue; end; end else Result:=''; TlkJSONObject(Jso).IndexOfName() if Jso is TlkJSONObject then begin Result:=Result+'{'#13#10; for I := 0 to Jso.Count - 1 do begin Result:=Result+StringOfChar(#9,Level+1)+FormatJson(Jso.Child[I],Level+1); if I<>Jso.Count-1 then Result:=Result+','#13#10 else Result:=Result+#13#10; end; Result:=Result+StringOfChar(#9,Level)+'}'; end else if Jso is TlkJSONlist then begin Result:=Result+'['#13#10; for I := 0 to Jso.Count - 1 do begin Result:=Result+StringOfChar(#9,Level+1)+FormatJson(Jso.Child[I],Level+1); if I<>Jso.Count-1 then Result:=Result+','#13#10 else Result:=Result+#13#10; end; Result:=Result+StringOfChar(#9,Level)+']'; end else begin if Jso.SelfType=jsString then Result:=Result+'"'+Jso.Value+'"' else Result:=Result+VarToStr(Jso.Value); end; end; procedure TForm20.Button1Click(Sender: TObject); var Jso: TlkJSONbase; begin Jso := TlkJSON.ParseText(Memo1.Text); try Memo1.Clear; Memo1.Text := FormatJson(Jso,0); finally Jso.Free; end; end;