最近项目中要使用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格式化函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 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 ; |
摘自:http://www.cnblogs.com/manors/archive/2010/01/28/1658808.html
没有评论:
发表评论