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的更多相关文章

  1. Delphi 10 Seattle plus 新特性——System.JSON.Builders

    { 全能中间件 —— 简单.高效.稳定.安全的三层中间件 1.支持 多账套多数据库,包括SQLite, MySQL, SQL Server, Oracle, PostgreSQL, DB2, SQL ...

  2. Delphi 10.2 JSON与对象/结构体序列化性能提高100多倍

    今天在盒子闲逛,无意中看到有人说XE7自带的Json对象序列化很慢,帖子在这里:http://bbs.2ccc.com/topic.asp?topicid=464378;经过测试的确如此.     但 ...

  3. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)

    Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...

  4. DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST

    Delphi XE10,Json 生成和解析,再利用indyhttp控件Post 年09月20日 :: 阅读数: --不多说,直接上代码 procedure TFrmMain.Brand; var J ...

  5. Xe7 System.Json解析数据格式

    一.Demo一 解析嵌套数组 Json数据 {"code":1,"msg":"","data":{"Grade ...

  6. delphi c++builder JSON 生成与解析 例子

    json,System.JSON,REST.JSON JSON有两种数据结构,对象和数组. 对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...} 数组 ...

  7. delphi 实体类 JSON 数组

    delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas   TJson.JsonToObjectTJson.ObjectToJsonString JsonEncode O ...

  8. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决

    Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...

  9. System.Json 使用注意

    在xamarin中对json字符串进行解析,使用System.Json时出现怪问题: json-string = { "ret" : "OK" } 使用如下代码 ...

  10. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

随机推荐

  1. jquery cookie操作方法

    1. 设置cookie的值,把name变量的值设为value     $.cookie(’name’, ‘value’);  2.新建一个cookie 包括有效期 路径 域名等 $.cookie(’n ...

  2. js中formData的使用

    FormData 对象的使用 https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects http ...

  3. phpexcel对于中文路径和中文名称的问题(有疑问)

    phpexcel对于中文的文件名无法读取(我本地环境都是utf-8的编码) 是不是win系统识别都是gbk ?(需要把utf-8的字符串改为gbk) $file = "C:\\Users\\ ...

  4. atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性

    atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性 1. 授权(权利来源)的5种模式 1 2. 企业的组织机构与管理运作来源于国家的管理...而国家的管理又来源于宗教 ...

  5. VS中几个自动完成快捷键,还算实用

    1,F2更换名字,自动完成 2.try switch等按两次TAB建,自动完成格式 3.自动属性快捷键  ctrl+r,ctrl+e       有人说是加个分号  就不需要写get  set了.上下 ...

  6. mysql获取插入的id主键

    long _retId = -1; Connection con = null; try { con = queryRunner.getDataSource().getConnection(); qu ...

  7. php的颜色定义表

    http://outofmemory.cn/code-snippet/1960/php-color-define-table <? /////////////////////////////// ...

  8. 如何设置python的编码格式为utf-8

    重装了系统(ubuntu 14.04)原来正常可用的OpenERP项目在切换到开发者模式的时候报错: UnicodeDecodeError: 'ascii' codec can't decode by ...

  9. 使用Data URL将图片嵌入到网页中

    早些时候,使用IE6浏览器,网页可以另存为mht,如果网页包含图片,那么图片也会存储到mht中. mht是微软提供的一种聚合HTML文档,它的本质其实是一个文本文件,那么我们也许会好奇,它的图片存储到 ...

  10. 关于css中层叠性的一点理解

    关于css层叠性的一点理解 标签(空格分隔): html css 我们平时在写css的时候会遇到这样的情况 <!DOCTYPE html> <html lang="en&q ...