• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi用QJSON解析JSON格式的数据【转】

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本来用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":"已取件,到达 [福建_厦门支公司]"}
]}

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);

转自:https://www.cnblogs.com/codingnote/p/3821025.html?utm_source=tuicool&utm_medium=referral


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
MATLAB之语言介绍发布时间:2022-07-18
下一篇:
Delphi XE5 for Android (十)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap