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":"已取件,到达 [福建_厦门支公司]"}
]}
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格式的数据 【转】的更多相关文章
- 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 ...
随机推荐
- 20190903 - CSDN 的奇葩替换
可能是出于安全原因 CSDN 对内容中的代码,作了很多奇葩的替换. 比如下面两行,是否有差别? # - # -16 有.其实 cut 后的短横线,内部编码不同,前者复制后无法被识别. 再比如下面两个词 ...
- 【网易微专业】图表绘制工具Matplotlib
01 与图片的交互方式设置 这一小节简要介绍一下Matplotlib的交互方式 import pandas as pd import numpy as np import matplotlib.pyp ...
- mysql数据库查找数据的方法。
今日内容 1.外键的变种 唯一索引:关键字 unique(num) 作用:使指定的列,中的属性不能重复,并且加速查找案例:create table t5(id int,num int,unique(n ...
- Mybatis 属性配置
properties 定义配置,配置的属性可以在整个配置文件中的其他位置进行引用 <properties resource="db.properties"></ ...
- 不同种类的PI膜及其特性
一.PI膜种类及其特性 1.聚酰亚胺材料分类 聚酰亚胺材料可分为热塑性聚酰亚胺和热固性聚酰亚胺(包括双马来酰亚胺型和单体反应聚合型聚酰亚胺及各自改性产品)两大类 其中,热塑性聚酰亚胺材料一般采用两步法 ...
- NDK学习笔记-JNI数据类型和属性方法的访问
JNI实现了C/C++与Java的相互访问,那么这篇文章就从C/C++访问Java开始说起 native函数说明 每个native函数,都至少有两个参数(JNIEnv *和jclass或jobject ...
- freeRTOS学习二
临界段,用一句话概括就是一段在执行时不能被中断的代码段. 临界段被打断的情况,一个是系统调度,还有一个就是外部中断. 对临界段的保护就是对中断的开和关. 空闲任务与阻塞延时 xTicksToDelay ...
- cmake升级到3.10以上
使用yun install cmake3 安装 ,不会覆盖centos7 cmake 1 添加cmake3 源 echo '[group_kdesig-cmake3_EPEL]name=Copr re ...
- [bzoj1775][Usaco2009 Dec]Vidgame 电视游戏问题_背包dp
1775: [Usaco2009 Dec]Vidgame 电视游戏问题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1775 题解: 发 ...
- Cow and Snacks(吃点心--图论转换) Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2)
题意:https://codeforc.es/contest/1209/problem/D 有n个点心,有k个人,每个人都有喜欢的两个点心,现在给他们排个队,一个一个吃,每个人只要有自己喜欢的点心就会 ...