kbmmw 中JSON 操作入门

本文介绍了在Delphi中使用kbmmw库进行JSON数据处理的方法。包括创建JSON对象、数组,以及读取和写入JSON字符串的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在各种系统中JSON 用的越来越多。delphi 也自身支持JSON 处理。

今天简要说一下kbmmw 内部如何使用和操作JSON。

kbmmw 中json的操作是以TkbmMWJSONStreamer 为基础,要导入、导出JSON字符串, 首先要创建TkbmMWJSONStreamer.

 然后是 TkbmMWJSONObject和 TkbmMWJSONArray。

先举一个最简单的例子。

procedure TForm1.Button3Click(Sender: TObject);
var
  myjson:TkbmMWJSONStreamer;
  alljson: TkbmMWJSONObject;
  s:String;
begin

   myjson:=TkbmMWJSONStreamer.Create; // 建立JSON流

   alljson:=TkbmMWJSONObject.Create; // 建立JSON 对象

   alljson.AsString['root']:='ok'; // 赋值

   s:=myjson.SaveToUTF16String(alljson);
   memo1.Lines.Clear;
   memo1.Lines.Add(s);

   alljson.Free;
   myjson.Free;
end;

以上代码运行结果为

{"root":"ok"}

继续修改添加一些代码

procedure TForm1.Button3Click(Sender: TObject);
var
  myjson:TkbmMWJSONStreamer;
  alljson: TkbmMWJSONObject;
  djson:TkbmMWJSONObject;
  s:String;
begin

   myjson:=TkbmMWJSONStreamer.Create;

   alljson:=TkbmMWJSONObject.Create;

   djson:=TkbmMWJSONObject.Create; // 新建一个子对象

   djson.Asinteger['ID']:=1;
   djson.AsString['name']:='xalion';
   djson.AsDateTime['date']:=now;

   alljson.AsObject['result']:=djson;

   s:=myjson.SaveToUTF16String(alljson);
   memo1.Lines.Clear;
   memo1.Lines.Add(s);


   alljson.Free;
   myjson.Free;

end;

 

这样返回的结果如下

{"result":{"ID":1,"name":"xalion","date":"2017-07-01T01:00:00.427+08:00"}}

即返回一条记录信息。

如果需要返回多条记录,就需要使用TkbmMWJSONArray。

procedure TForm1.Button3Click(Sender: TObject);
var
  myjson:TkbmMWJSONStreamer;
  alljson: TkbmMWJSONObject;
  djson:TkbmMWJSONObject;
   datajson: TkbmMWJSONArray;
  s:String;
  I: Integer;
begin

   myjson:=TkbmMWJSONStreamer.Create;  // 建立一个JSON 流

   alljson:=TkbmMWJSONObject.Create;  // 建立一个JOSN 根对象

   datajson:=TkbmMWJSONArray.Create;   //建立一个JSON 数组

   for I :=1 to 10 do
    begin
         djson:=TkbmMWJSONObject.Create;
         djson.Asinteger['ID']:=i;
         djson.AsString['name']:='xalion';
         djson.AsDateTime['date']:=now;

         datajson.Add(djson);         // 加入数据

    end;

    alljson.AsArray['result']:=datajson;

   s:=myjson.SaveToUTF16String(alljson);
   memo1.Lines.Clear;
   memo1.Lines.Add(s);


   alljson.Free;
   myjson.Free;

end;

最后输出结果为

{"result":[{"ID":1,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":2,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":3,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":4,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":5,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":6,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":7,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":8,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":9,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"},{"ID":10,"name":"xalion","date":"2017-07-01T01:16:44.960+08:00"}]}

下面讲一下如何访问JSON字符串里面的对象和值

procedure TForm1.Button4Click(Sender: TObject);
var
  myjson:TkbmMWJSONStreamer;
  alljson: TkbmMWJSONObject;
begin
    myjson:=TkbmMWJSONStreamer.Create;  // 建立一个JSON 流

    alljson:=TkbmMWJSONObject( myjson.LoadFromUTF16String(memo1.Lines.Text)); // 载入到根JSON

    memo2.Lines.Clear;

    memo2.Lines.Add(alljson.AsString['root']);

    alljson.Free;
    myjson.Free;

end;

运行截图

访问对象

procedure TForm1.Button4Click(Sender: TObject);
var
  myjson:TkbmMWJSONStreamer;
  alljson: TkbmMWJSONObject;
begin
    myjson:=TkbmMWJSONStreamer.Create;  // 建立一个JSON 流

    alljson:=TkbmMWJSONObject( myjson.LoadFromUTF16String(memo1.Lines.Text)); // 载入到根JSON

    memo2.Lines.Clear;

    memo2.Lines.Add(alljson.AsObject['result'].AsString['name'] );

    alljson.Free;
    myjson.Free;

end;

运行结果

访问数组

procedure TForm1.Button4Click(Sender: TObject);
var
  myjson:TkbmMWJSONStreamer;
  alljson: TkbmMWJSONObject;
   jresult:TkbmMWJSONArray;
begin
    myjson:=TkbmMWJSONStreamer.Create;  // 建立一个JSON 流

    alljson:=TkbmMWJSONObject( myjson.LoadFromUTF16String(memo1.Lines.Text)); // 载入到根JSON

    memo2.Lines.Clear;

    jresult:=TkbmMWJSONArray(alljson.AsArray['result']);    // 返回数组


    memo2.Lines.Add(jresult.AsObject[5].AsString['name'] );


    alljson.Free;
    myjson.Free;

end;

运行结果

 

 延伸一下

procedure TForm1.Button4Click(Sender: TObject);
var
  myjson:TkbmMWJSONStreamer;
  alljson: TkbmMWJSONObject;
  jresult:TkbmMWJSONArray;
  i:integer;
begin
    myjson:=TkbmMWJSONStreamer.Create;  // 建立一个JSON 流

    alljson:=TkbmMWJSONObject( myjson.LoadFromUTF16String(memo1.Lines.Text)); // 载入到根JSON

    memo2.Lines.Clear;

    jresult:=TkbmMWJSONArray(alljson.AsArray['result']);    // 返回数组


    memo2.Lines.Add(jresult.AsObject[5].AsString['name'] );

    memo2.lines.Add('数组大小:'+jresult.Count.ToString  );
    memo2.lines.Add('属性个数:'+jresult.AsObject[5].PropertyCount.ToString  );

    for I := 1 to jresult.AsObject[5].PropertyCount do

          memo2.lines.Add('属性'+i.ToString+'名:'+jresult.AsObject[5].PropertyName[i-1]);


    alljson.Free;
    myjson.Free;

end;

运行结果

总之,用kbmmw 操作JSON 非常方便,更牛的是,这个可以与XML,BSON,YAML 实现无缝互转。

 

winxp+delphi7+kbmmw4.0.3+unidac+mssql2000+dbgrideh 基本实现xalion中所说的功能并加上自己的一些编写经验 1、远程方法调用 2、取图像(流的使用) 3、查询数据 4、编辑数据:增、删、改(如果操作错误会进行相应的提示) 5、存储过程使用方法(存储过程参数自动创建) 6、动态创建数据集并执行Insert操作 7、命名查询(namedQuery) 8、事务操作(直接写SQL语句更新表的事务操作,有个重要的属性要设置,否则会更新不成功) 9、使用的数据库:sqlserver 2000,请到服务器的FDM单元把连接参数改下 10、数据库kbm_test结构参见:kbm_test.sql 11、安装kbmMw时请把配置文件 kbmMWConfig.inc中 {$DEFINE KBMMW_UNIDAC_SUPPORT} // UNIDAC support. 前面的//去掉 12、使用delphi7 2012年8月新增功能与说明 1、客户端断线重连:kbmMWTCPIPIndyClientTransport1.MaxRetries := 2;//重连一次 2、对象传输 3、JSON传输(利用kbmmw带的json库实现) 4、客户端断开代码: if FDM.kbmMWSimpleClient1.Transport.IsConnected then begin //memo1.Lines.Add('程序已有300秒没有进行操作,断开连接'); FDM.kbmMWSimpleClient1.Disconnect; end; 5、新增远程过程调用函数(直接SQL语句操作数据库): startTran:启动事务 commitTran:提交事务 rollbackTran:回滚事务 openSql:打开SQL语句 execSql:执行SQL语句 注openSql、execSql两个函数体代码使用对象连接池技术,无对象创建与释放,以提高系统效率, 具体能提高多少,未实测 6、增加HTTP协议例子(参考资料:kbmMW_and_AJAX.pdf),提供http-get的功能,http-post的功能可参照http-get方法实现 7、提供数据集转jsonjson转数据集 (CDSFromJSon(CDS:TClientDataSet;JsonStr:string):Boolean)单元:uDBJson.pas 参照代码可自行把jsonkbmmwQuery kbmmw编译unidac方法: 修改单元kbmMWUNIDAC.pas,本人在数据库中很少用到blob字段,所以在代码里屏蔽掉blob字段的处理, 经测试数据库表字段类型为Text时,程序可以正常处理 报OLE DB error occured. CoInitialize has not been called (server)错误解决: unidac41src\Source\UniProviders\SQLServer\OLEDBAccessUni.pas constructor TOLEDBConnection.Create; begin inherited; CoInitialize(nil);//加此句 FCommand := nil; ... end; destructor TOLEDBConnection.Destroy; begin Disconnect; FCommand.Free; CoUninitialize;//加此句 inherited; end; 作者:chensm@vip.qq.com kbmmw开发交流群:209321818
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值