使用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;

 

posted @ 2010-01-28 21:54  庄园  阅读(7990)  评论(3编辑  收藏  举报