Delphi用QJSON解析JSON格式的数据
本来用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 := 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);
Delphi用QJSON解析JSON格式的数据的更多相关文章
- Delphi用QJSON解析JSON格式的数据 【转】
本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message ...
- 使用google的GSON解析json格式的数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...
- Python3基础 json.loads 解析json格式的数据,得到一个字典
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 用GSON解析Json格式数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...
- $Java-json系列(一):用GSON解析Json格式数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...
- 在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据
百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路 ...
- 解析json格式数据
实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...
- C#解析Json格式数据小结
最近,遇到了一些不同的Json格式的数据,需要做不同处理才能转化为想要得到的结果,这里总结一下. 第一种形式:status中是{}形式,对象 string json = @"{'name': ...
- 实现android上解析Json格式数据功能
实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...
随机推荐
- XMLHttpRequest.status状态码
XMLHttpRequest.status状态码1xx-信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. 100-继续. 101-切换协议. 2xx-成 ...
- appium 常用API
''.appium api第二弹 锋利的python,这是初稿,2015/1/5 如有错误的地方,请同学们进行留言,我会及时予以修改,尽量整合一份ok的api 作者:Mads Spiral QQ:79 ...
- Spring jar包详解
Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...
- Java之工厂方法
普通工厂模式: 第一步:定义接口,坚持面向接口编程, package dp; public interface Sender { public void send();} 第二步:实现接口: p ...
- TypeError: coercing to Unicode: need string or buffer, ChatRoom found
在用django框架中遇到一个错误,是模型编写中出的错误 TypeError: coercing to Unicode: need string or buffer, ChatRoom found 解 ...
- xml和json的区别
本文转自SanMaoSpace的博客 链接地址如下:http://www.cnblogs.com/SanMaoSpace/p/3139186.html 1.定义介绍 (1).XML定义扩展标记语言 ( ...
- javac 导入第三方jar包
如果是导入一个包,只需要 javac -classpath xxx/xxx/xxx.jar xxx.java 即可 如果有多个包,windows下用分号隔开,Lunix下用冒号隔开即可.
- [转]IE8兼容Jquery.validate.js兼容问题
只需在jquery.validate.js 文件中在446行附近找到return $([]).add(this.currentForm.elements).filter(":input&qu ...
- Linux 常用命令集合
1. 常用命令 ls 显示当前目录下的文件和文件夹: -ltr 按时间顺序显示文件和文件夹的详细信息,不带参数的时候 只显示文件夹和文件. vi 打开文件的内容 tar -cvf file.tar ...
- Python【7】-数据分析准备
一.经常用到的python库: Numpy:Python科学计算的基础包: pandas:提供了能使我们快捷的处理结构化数据的大量数据结构和函数: matplotlib:用于绘制数据图表的python ...