delphi xe-system.json
Delphi XE10有一个对JSON处理的单元,在你需要使用JSON的单元里面引入"System.json",随后你就可以用Delphi自己的json处理类了。
普通解析
实例1:
jsonString ='{
"_id" : "",
"dev" : "",
"type" : "PHYSICAL",
"math" : {
"consts" : {
"CT" : 1,
"PT" : 1
},
"exprs" : {}
},
"name" : "炼铁#除尘高压室"
}'
procedure TFrm__dev.Act_F__editExecute(Sender: TObject);
var
DevObject,Mathobj,Contstsobj: TJSONObject; // JSON类
Smath,Scontsts,sCT,sPT,sDEV:string;
begin
DevObject:=TJSONObject.ParseJSONValue(jsonString ) as TJSONObject; //从字符串生成JSON
Smath:=DevObject.GetValue('math').ToString;
Mathobj:=TJSONObject.ParseJSONValue(Smath) as TJSONObject;
Scontsts:=Mathobj.GetValue('consts').ToString;
Contstsobj:=TJSONObject.ParseJSONValue(Scontsts) as TJSONObject;
sDEV:=DevObject.getValue('dev');//得到DEV
sCT := Contstsobj.GetValue('CT').ToString; //得到CT
sPT := Contstsobj.GetValue('PT').ToString;
Frm__devAdd.ShowModal;
end;
实例2:带数组的解析
jsonString :=‘
{ "_id" : "测试",
"dev" : "测试",
"vdev" : {
"params" : {
"args" : [
"A",
"B"
]
}
}
}
’
argsArr:TJSONArray;
sID:= DBGrid1.DataSource.DataSet.FieldByName('_id').Value ;
sTYPE:= DBGrid1.DataSource.DataSet.FieldByName('type').Value ;
dSelector:=JSON(['_id',sID]);
d:=FMongoWire.Get(devCol,dSelector);
DevObject:=TJSONObject.ParseJSONValue(d.ToString) as TJSONObject; //从字符串生成JSON
Svdev:=DevObject.GetValue('vdev').ToString; //vdev
vdevobj:=TJSONObject.ParseJSONValue(Svdev) as TJSONObject;
Sparams:=vdevobj.GetValue('params').ToString; //params
paramsobj:=TJSONObject.ParseJSONValue(Sparams) as TJSONObject;
argsArr:=TJSONArray(paramsobj.GetValue('args')); //args数组
for i:= to argsArr.Size - do
begin
if(i<>)then sarg:=sarg+',';
sarg:=sarg+argsArr.items[i].value;
end;
内嵌循环解析

DevObject:=TJSONObject.ParseJSONValue(d1.ToString) as TJSONObject; //从字符串生成JSON
Svdev:=DevObject.GetValue('vdev').ToString;
Vdevobj:=TJSONObject.ParseJSONValue(Svdev) as TJSONObject;
Schannel:= Vdevobj.GetValue('channels').ToString;
Channelobj:=TJSONObject.ParseJSONValue(Schannel) as TJSONObject;
sch:= Channelobj.GetValue(sChs).ToString;
Chobj:=TJSONObject.ParseJSONValue(sch) as TJSONObject;
sinput:= Chobj.GetValue('inputs').ToString;
Inputobj:= TJSONObject.ParseJSONValue(sinput) as TJSONObject; for I := to Inputobj.Count- do //Inputobj.Count得到inputs内嵌个数。
begin
sin:=Inputobj.Get(i).JsonValue.ToString;//得到对象的值 Inputobj.Get(i).JsonString.toString;//得到对象Key Inobj:= TJSONObject.ParseJSONValue(sin) as TJSONObject; if(Inobj.GetValue('val').Value='VALUE') then
begin
item := Frm__ChsAdd.ListView1.Items.Add;//listview增加一行
item.Caption := Inputobj.Get(i).JsonString.Value;//Inputobj.Get(i).JsonString.Value得到inputs下的对象名称
item.SubItems.Add(Inobj.GetValue('val').Value);//遍历对象名下的数值
item.SubItems.Add(Inobj.GetValue('dev').Value);
item.SubItems.Add(Inobj.GetValue('ch').Value);
end
else if(Inobj.GetValue('val').Value='CONSTANTS') then
begin
item := Frm__ChsAdd.ListView1.Items.Add;//listview增加一行
item.Caption := Inputobj.Get(i).JsonString.Value;
item.SubItems.Add(Inobj.GetValue('val').Value);
item.SubItems.Add('');
item.SubItems.Add('');
item.SubItems.Add(Inobj.GetValue('constant').Value);
end;
end;
数组里面嵌套多个对象

dqueryold:=FMongoWire.Get(chsCol,conditionold);
OldwlchObject:=TJSONObject.ParseJSONValue(dqueryold.ToString) as TJSONObject; //从字符串生成JSON
soldvdev:=OldwlchObject.GetValue('vdev').ToString; //vdev
oldwlvdevobj:=TJSONObject.ParseJSONValue(soldvdev) as TJSONObject;
srefs:=oldwlvdevobj.GetValue('refs').ToString; //refs
oldwlrefsobj:=TJSONObject.ParseJSONValue(srefs) as TJSONObject;
olddevArr:=TJSONArray(oldwlrefsobj.GetValue(sDev)); //args数组
for k:= to olddevArr.Size - do
begin
devsnum:=olddevArr.items[k].ToString;//第几个对象
temp := TJSONObject.ParseJSONValue(devsnum) as TJSONObject;设为对象
if((temp.GetValue('arg').Value=oldinput) and (temp.GetValue('ch').Value=sCh))then
begin end;
属性
个数 :
1)property Count: Integer read GetCount;//得到最外层数据个数
例子:num:=DevObject.count; 结果为5
这样有规律的数据 可以通过 循环得到
方法://判断指定的串值是否存在
1)function TJSONValue.TryGetValue<T>(const APath: string; out AValue: T): Boolean;/
上面实例运行查询时报错,是因为有些math不存在,如何检查一个指定的串值是否存在,
如果'math'不存在,JSONObject.GetValue方法是要产生异常的,那么,该如何检查math是否存在呢?
先声明一个
var
jsonvalue: Tjsonvalue;
if DevObject.TryGetValue('math', jsonvalue) then
begin
Smath:=DevObject.GetValue('math').ToString;
Mathobj:=TJSONObject.ParseJSONValue(Smath) as TJSONObject;
Scontsts:=Mathobj.GetValue('consts').ToString;
Contstsobj:=TJSONObject.ParseJSONValue(Scontsts) as TJSONObject;
sCT:= Contstsobj.GetValue('CT').ToString;
sPT:= Contstsobj.GetValue('PT').ToString;
end;
三、记录知识 :
用toString得到值在界面显示会有双引号
edt_expr.Text :=Svdevobj.GetValue('expr').Value;//得到不带双引号的值
edt_expr.Text :=Svdevobj.GetValue('expr').toString;//得到带引号的值
is TJSONArray先判断是不是数组。
delphi xe-system.json的更多相关文章
- Delphi 10 Seattle plus 新特性——System.JSON.Builders
{ 全能中间件 —— 简单.高效.稳定.安全的三层中间件 1.支持 多账套多数据库,包括SQLite, MySQL, SQL Server, Oracle, PostgreSQL, DB2, SQL ...
- Delphi 10.2 JSON与对象/结构体序列化性能提高100多倍
今天在盒子闲逛,无意中看到有人说XE7自带的Json对象序列化很慢,帖子在这里:http://bbs.2ccc.com/topic.asp?topicid=464378;经过测试的确如此. 但 ...
- Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)
Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...
- DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST
Delphi XE10,Json 生成和解析,再利用indyhttp控件Post 年09月20日 :: 阅读数: --不多说,直接上代码 procedure TFrmMain.Brand; var J ...
- Xe7 System.Json解析数据格式
一.Demo一 解析嵌套数组 Json数据 {"code":1,"msg":"","data":{"Grade ...
- delphi c++builder JSON 生成与解析 例子
json,System.JSON,REST.JSON JSON有两种数据结构,对象和数组. 对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...} 数组 ...
- delphi 实体类 JSON 数组
delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas TJson.JsonToObjectTJson.ObjectToJsonString JsonEncode O ...
- Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决
Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...
- System.Json 使用注意
在xamarin中对json字符串进行解析,使用System.Json时出现怪问题: json-string = { "ret" : "OK" } 使用如下代码 ...
- delphi 2010与delphi XE破解版的冲突
在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...
随机推荐
- Android中的UriMatcher、ContentUrist和ContentResolver
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据.Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris .掌握它们的 ...
- 解决Janusgraph索引状态不变更的问题
JanusGraph的索引因为要同步不同实例及不同后端的数据,因此不是实时能够完成的,视配置,网络和数据量不同,建立/生效索引通常需要一段时间,这也是为什么创建索引时会创建wait()的原因. 在实践 ...
- 理解、学习与使用Java中的Optional
从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异 ...
- Enable multithreading to use std::thread: Operation not permitted问题解决
在用g++ 4.8.2编译C++11的线程代码后,运行时遇到了如下报错: terminate called after throwing an instance of 'std::system_err ...
- maven依赖workspace和jar包
当开发maven项目时,如果workspace中有maven依赖的项目,并且groupid和artifactId都相同,maven就会优先依赖workspace中的项目文件,如果想依赖maven库中的 ...
- Hello,Ajax
学习了Ajax技术,写了一个最简单的Ajax应用 <%@page contentType="text/html; charset=utf-8" language=" ...
- IP代理软件
IP代理软件 IP代理软件就是通过第三方网络协议传输数据的一种加密软件:跟VPN,代理服务器原理一样,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通 过这个服务与另一个网络终端(一般为服务器 ...
- Android控件——7种形式的Android Dialog使用举例(转载)
在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...
- 【vijos】1750 建房子(线段树套线段树+前缀和)
https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad ...
- Ubuntu上安装与配置JDK1.8
Ubuntu上安装与配置JDK1.8 一.下载 下载JDK,由于是Ubuntu. 所以去官网下载tar.gz格式的就可以(ubuntu使用浏览器下载网速比較慢,所以推荐到window上下载好). ht ...