JSON

Delphi用QJSON解析JSON格式的数据

字号+ 作者:H5之家 来源:H5之家 2016-01-17 16:24 我要评论( )

本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动段使用,于是找到QJSON来处理。这是一个国内高手写开源免费的东西,赞一个。加入数据如下:复制

页面导航:首页 > 软件编程 > Delphi > Delphi用QJSON解析JSON格式的数据

Delphi用QJSON解析JSON格式的数据

来源: 作者: 时间:2016-01-15 15:17 【 】

本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动段使用,于是找到QJSON来处理。这是一个国内高手写开源免费的东西,赞一个。加入数据如下:复制代码{message:ok,status:1

本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动段使用,于是找到QJSON来处理。

 

这是一个国内高手写开源免费的东西,赞一个。

 

加入数据如下:

 

复制代码

{"message":"ok","status":"1","state":"3","data":

[{"time":"2012-07-07 13:35:14","context":"客户已签收"},

 {"time":"2012-07-07 09:10:10","context":"离开 [北京石景山营业厅] 派送中,递送员

[温],电话[]"},

 {"time":"2012-07-06 19:46:38","context":"到达 [北京石景山营业厅]"},

 {"time":"2012-07-06 15:22:32","context":"离开 [北京石景山营业厅] 派送中,递送员

[温],电话[]"},

 {"time":"2012-07-06 15:05:00","context":"到达 [北京石景山营业厅]"},

 {"time":"2012-07-06 13:37:52","context":"离开 [北京_同城中转站] 发往 [北京石景山

营业厅]"},

 {"time":"2012-07-06 12:54:41","context":"到达 [北京_同城中转站]"},

 {"time":"2012-07-06 11:11:03","context":"离开 [北京运转中心驻站班组] 发往 [北京_

同城中转站]"},

 {"time":"2012-07-06 10:43:21","context":"到达 [北京运转中心驻站班组]"},

 {"time":"2012-07-05 21:18:53","context":"离开 [福建_厦门支公司] 发往 [北京运转中

心_航空]"},

 {"time":"2012-07-05 20:07:27","context":"已取件,到达 [福建_厦门支公司]"}

]} 

复制代码

用QJSON解析如下:

 

复制代码

procedure TForm15.Button1Click(Sender: TObject);

var

  aqjson,aqjsonarr : TQJSON;

  i : Integer;

  stime, scontext : string;

begin

  aqjson := TQJSON.Create;

  aqjson.parse(memo1.lines.text);

  if aqjson.ValueByName('message', '') = 'ok' then

  begin

    memo2.Clear;

    aqjsonarr := aqjson.ItemByName('data');

    for i := 0 to aqjsonarr.Count - 1 do

    begin

      stime := aqjsonarr.Items[i].ValueByName('time', '');

      scontext := aqjsonarr.Items[i].ValueByName('context', '');

 

      Memo2.Lines.Add(stime+'----'+scontext);

    end;

  end;

end;

复制代码

可以看到QJSON的解析还是很方便的。

 

不过这种格式存在大量冗余数据——每个数据项都携带了字段信息,其实可以只返回一次字段信息即可。

 

数据精简如下:

 

{"message":"ok","status":"1","state":"3","data":

["2012-07-07 13:35:14","客户已签收",

 "2012-07-07 09:10:10","离开 [北京石景山营业厅] 派送中,递送员[温],电话[]",

]} 

可以看到数组里面的串不再是JSON格式(Key:Value)的了,这时不能再使用ValueByName,而直接使用Value。

 

复制代码

procedure TForm15.Button2Click(Sender: TObject);

var

  aqjson,aqjsonarr : TQJSON;

  i : Integer;

  stime, scontext : string;

begin

  aqjson := TQJSON.Create;

  aqjson.parse(memo3.lines.text);

  if aqjson.ValueByName('message', '') = 'ok' then

  begin

    memo2.Clear;

    aqjsonarr := aqjson.ItemByName('data');

    for i := 0 to aqjsonarr.Count - 1 do

    begin

      stime := aqjsonarr.Items[i].ValueByName('time', '');

      scontext := aqjsonarr.Items[i].ToString;

 

      Memo2.Lines.Add(stime+'----'+scontext);

    end;

  end;

end;

复制代码

实际编码中,会存在返回图片到客户端的情况,如果也采用JSON格式传输的话,需要把图片转成Base64格式的传包装,然后再传输到客户端解析。

 

这里是一个演示,首先把图片转成流:

 

Image1.Picture.Graphic.SaveToStream(ss);

然后编码成base64格式的:

 

EncodeStream(ss, ss1);

注意ss和ss1的定义:

 

var

  ss: TMemoryStream;

  ss1,ss2 : TStringStream;

EncodeStream的调用需要引用EncdDecd.pas单元。

 

然后把流转成字符串

复制代码

var

  sdata : string;

begin

...

  sData := ss1.DataString;

...

end;

复制代码

再把该字符串包装到JSON串:

 

复制代码

var

  aqjson : TQJSON;

begin

  aqjson := TQJSON.Create;

  aqjson.Parse(memo3.Lines.Text);

...

  aqjson.AddArray('pic').Add.AsString :=sdata;

...

end;

复制代码

这样图片就打包到JSON里面了,传到客户端以后,再反过来解析即可:

 

ss2 := TStringStream.Create(aqjson.ItemByName('pic').Items[0].value);

DecodeStream(ss2,ss);//将base64字符流还原为内存流

ss.Position := 0; // 必须

Image2.Picture.Graphic.LoadFromStream(ss);

Tags:

本文链接:

上一篇:Delphi数据库的三层架构的问题和解决方法

下一篇:Delphi下OpenGL2d绘图(05)-画图片Bmp

相关文章

文章评论

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评