本来用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 := to aqjsonarr.Count - 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 := to aqjsonarr.Count - 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[].value);
DecodeStream(ss2,ss);//将base64字符流还原为内存流
ss.Position := ; // 必须
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. GB、GBDT、XGboost理解

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  2. 【ABAP系列】SAP MAC GUI750安装过程

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP MAC GUI750安装 ...

  3. android#boardcast#发送自定义广播

    广播主要分为两种类型,标准广播和有序广播,通过实践的方式来看下这两种广播具体的区别. 一.发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发.因此新 ...

  4. k8s nginx-ingress 上传文件大小限制

    k8s集群中,将图片或是文件上传到文件服务器上, 可是大于1M是就会报错 413 Request Entity Too Large 以前用的是:    # ingress.kubernetes.io/ ...

  5. dfs -cogs 5 P服务点设置

    题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=FSXJmiJSg   问题描述为了进一步普及九年义务教育,政府要在某乡镇建立P所希望小学 ...

  6. GPD mircoPC linux系统安装

    前言 GPD 全称GamePad Digital, 深圳市中软赢科技术有限公司持有的品牌,其主要生产掌机,最近开始涉足办公级UMPC.其中有款UMPC--mircoPC堪称神作.接口齐全,黑大粗,耐操 ...

  7. Spring IoC的形象化理解

    1.IoC(控制反转) 首先想说说IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象 ...

  8. 今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个

    /* 题目描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球 ...

  9. Stream系列(十四)parallet方法使用

    并发 视频讲解:https://www.bilibili.com/video/av78408286/ EmployeeTestCase.java package com.example.demo; i ...

  10. Linux系列(6):入门之文件与目录管理

    你知道常见的目录操作吗? 知道如何查询文件内容吗? 了解 umask 指令吗,知道如何查看和设置文件的默认权限吗? 知道文件的隐藏属性吗,了解如何设置(chattr指令)并查看(lsattr指令)吗? ...