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

  1. procedure TForm15.Button1Click(Sender: TObject);
  2. var
  3. aqjson,aqjsonarr : TQJSON;
  4. i : Integer;
  5. stime, scontext : string;
  6. begin
  7. aqjson := TQJSON.Create;
  8. aqjson.parse(memo1.lines.text);
  9. if aqjson.ValueByName('message', '') = 'ok' then
  10. begin
  11. memo2.Clear;
  12. aqjsonarr := aqjson.ItemByName('data');
  13. for i := to aqjsonarr.Count - do
  14. begin
  15. stime := aqjsonarr.Items[i].ValueByName('time', '');
  16. scontext := aqjsonarr.Items[i].ValueByName('context', '');
  17.  
  18. Memo2.Lines.Add(stime+'----'+scontext);
  19. end;
  20. end;
  21. end;

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

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

数据精简如下:

  1. {"message":"ok","status":"1","state":"3","data":
  2. ["2012-07-07 13:35:14","客户已签收",
  3. "2012-07-07 09:10:10","离开 [北京石景山营业厅] 派送中,递送员[温],电话[]",
  4. ]}
  5.  
  6. 可以看到数组里面的串不再是JSON格式(Key:Value)的了,这时不能再使用ValueByName,而直接使用Value
  1. procedure TForm15.Button2Click(Sender: TObject);
  2. var
  3. aqjson,aqjsonarr : TQJSON;
  4. i : Integer;
  5. stime, scontext : string;
  6. begin
  7. aqjson := TQJSON.Create;
  8. aqjson.parse(memo3.lines.text);
  9. if aqjson.ValueByName('message', '') = 'ok' then
  10. begin
  11. memo2.Clear;
  12. aqjsonarr := aqjson.ItemByName('data');
  13. for i := to aqjsonarr.Count - do
  14. begin
  15. stime := aqjsonarr.Items[i].ValueByName('time', '');
  16. scontext := aqjsonarr.Items[i].ToString;
  17.  
  18. Memo2.Lines.Add(stime+'----'+scontext);
  19. end;
  20. end;
  21. end;

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

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

  1. Image1.Picture.Graphic.SaveToStream(ss);

然后编码成base64格式的:

  1. EncodeStream(ss, ss1);

注意ss和ss1的定义:

  1. var
  2. ss: TMemoryStream;
  3. ss1,ss2 : TStringStream;
  1. EncodeStream的调用需要引用EncdDecd.pas单元。
  2.  
  3. 然后把流转成字符串
  1. var
  2. sdata : string;
  3. begin
  4. ...
  5. sData := ss1.DataString;
  6. ...
  7. end;

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

  1. var
  2. aqjson : TQJSON;
  3. begin
  4. aqjson := TQJSON.Create;
  5. aqjson.Parse(memo3.Lines.Text);
  6. ...
  7. aqjson.AddArray('pic').Add.AsString :=sdata;
  8. ...
  9. end;

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

  1. ss2 := TStringStream.Create(aqjson.ItemByName('pic').Items[].value);
  2. DecodeStream(ss2,ss);//将base64字符流还原为内存流
  3. ss.Position := ; // 必须
  4. Image2.Picture.Graphic.LoadFromStream(ss);

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

Delphi用QJSON解析JSON格式的数据 【转】的更多相关文章

  1. Delphi用QJSON解析JSON格式的数据

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

  2. 使用google的GSON解析json格式的数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  3. Python3基础 json.loads 解析json格式的数据,得到一个字典

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. 用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  5. $Java-json系列(一):用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  6. 在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据

    百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路 ...

  7. 解析json格式数据

    实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...

  8. C#解析Json格式数据小结

    最近,遇到了一些不同的Json格式的数据,需要做不同处理才能转化为想要得到的结果,这里总结一下. 第一种形式:status中是{}形式,对象 string json = @"{'name': ...

  9. 实现android上解析Json格式数据功能

    实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...

随机推荐

  1. Server2008实验——私钥和添加数据恢复代理程序

    导出和安装私钥 当一个用户加密一个文件的时候,生成证书,拥有证书的私钥的用户才能够解开这个加密文件:为了防止私钥丢失导致加密文件不可打开,可以导出私钥给同一个用户组的用户帮忙打开: 1.创建[xl]和 ...

  2. unity+android权限--打开应用不弹权限,动态请求权限

    因为笔者之前的游戏需要分享图片,会请求外部储存,第一次打开游戏就会出现弹窗: 很多人对这个很敏感,怕你访问到他们的照片隐私,看到这个权限就拒绝,甚至卸载,实际上我们只是想截屏游戏内容分享给其他玩家,但 ...

  3. IntelliJ IDEA入门之常用配置以及问题解决(持续更新中)

    软件版本: IntelliJ IDEA 2019.1.1(Ultimate Edition) 运行环境: JDK1.8, Tomcat8.0, Maven3.6 我们在学习新的无论是jar包, 框架, ...

  4. 产品之我见(2)-求职APP

    在求职过程中使用了BOSS直聘.拉钩.领英这三款软件,下面来讲述一下作为求职者身份的使用感受以及遇到的问题.            一.BOSS直聘 手机端:打开首先是标语“互联网招聘神器”的页面   ...

  5. 【VS开发】关于各种View的实现总结

    [VS开发]关于各种View的实现总结 标签(空格分隔): [VS开发] 最近两天整理了一下各种View的实现,实际上各种View也只是实现了对应Dialog对话框中的一些控件而已,比如CListCt ...

  6. 22.把hive表中数据导入到mysql中

    先通过可视化工具链接mysql,在链接的时候用sqoop 用户登录 在数据库userdb下新建表 保存,输入表名upflow 现在我们需要把hive里面的数据通过sqoop导入到mysql里面 sqo ...

  7. 使用Minikube运行一个本地单节点Kubernetes集群

    使用Minikube是运行Kubernetes集群最简单.最快捷的途径,Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用. ⒈安装Minikube Mi ...

  8. Servlet简单例子

    一.项目结构 二.index.jsp <%@ page contentType="text/html; charset=utf-8" %> <html> & ...

  9. P1417 烹调方案(思维+01背包)

    (点击此处查看原题) 题意 有n种食材,每种食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间.问在T时间内,什么样的烹调方案 ...

  10. jdbc插入mysql时间差14个小时的解决方案

    在java中new Date()输出的时间是没错的,插入到mysql后少了14个小时,原因是新版jdbc驱动的时区设置问题. 在jdbc连接url最后加上serverTimezone=GMT%2B8即 ...