最近项目中要使用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
没有评论:
发表评论