最近项目中要使用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;