谈 Delphi 中 JSON 的简便操作(非常简单)

        

 

        我曾有讲过Delphi操作JSON的方法,特别是这一篇【delphi】类和记录的 helpers(助手)。但是因为当时是主要介绍的是Delphi的Helper,大家可能并没注意到Delphi中JSON的简便操作方法。

        早期Delphi并没有自己的JSON操作库,大家使用最多的是三方的SuperObject(名气很大),后来Delphi有了自己原生的JSON操作库(Delphi从版本XE6开始原生支持JSON操作),设计的非常完善,但是操作起来写的代码太多(谁用谁知道)。那么Delphi原生的JSON操作能否也像原来的SuperObject那样,书写代码量少又很优雅呢,当然可以。

        直接上使用的代码,注意,要引用uJSON_Helper.pas这个单元,代码已经附在最后。细细品味,你一定有收获!

S[ ]:表示字符串
I[ ]:表示整型数
I64[ ]:表示int64
D [ ]:表示日期
A [ ]:表示数组
O[ ]:表示TJSONObject对象
B[ ]:表示逻辑值

Exists[ ]:判断节点是否存在

Delete[ ]:删除节点

使用Demo

usesuJSON_Helper;varjo : TJSONObject;S  : string;sName : string;iAge  : Integer;bSex  : Boolean;sBirth: string;iSalary : Int64;sHobby1 : string;
beginjo := TJSONObject.Create;try//赋值操作jo.S['name'] := 'sensor';jo.I['age']  := 50;jo.B['sex']  := True;     //True表示男,False表示女jo.D['Birth']:= StrToDateTime('1970-02-13');   //日期型参数//子对象jo.O['workplace'] := TJSONObject.Create;jo.O['workplace'].S['address'] := '深圳市南山区科技园';jo.O['workplace'].S['tel'] := '0755-831788xx';jo.O['workplace'].I64['salary'] := 9223372036854775807;//数组jo.A['hobbies'] := TJSONArray.Create;jo.A['hobbies'].Add('乒乓球');jo.A['hobbies'].Add('下象棋');//S := jo.ToJSON;//S := jo.ToString;S := jo.Format;  //格式化成字符串,Delphi 10.3以后才有的格式化功能//读取操作sName := jo.S['name'];   //sensoriAge  := jo.I['age'];    //57bSex  := jo.B['sex'];    //TruesBirth:= FormatDateTime('YYYY-MM-DD',jo.D['Birth']);  // 1970-02-13iSalary:= jo.O['workplace'].I64['salary'];   // 9223372036854775807sHobby1 := jo.A['hobbies'].Items[0].Value;    // 乒乓球//删除操作jo.DeletePair('sex');     // 删除性别 函数法jo.Delete['sex'];         // 删除性别 数组法S := jo.Format;finallyjo.Free;end;end;

第一个S值

     {
            "name": "sensor",
            "age": 50,
            "Birth": 25612,

            "Sex": True,
            "workplace": {
                    "address": "深圳市南山区科技园",
                     "tel": "0755-831788xx",
                     "salary": 9223372036854775807
            },
            "hobbies": [
                "乒乓球",
                "下象棋"
            ]
        }

第二个S值

        {
            "name": "sensor",
            "age": 50,
            "Birth": 25612,
            "workplace": {
                    "address": "深圳市南山区科技园",
                     "tel": "0755-831788xx",
                     "salary": 9223372036854775807
            },
            "hobbies": [
                "乒乓球",
                "下象棋"
            ]
        }

uJSON_Helper.pas 完整代码

{**************************************
时间:2021-06-182023-07-15 增加了删除函数
功能:1 实现delphi原生的JSON操作为 S[] 操作方式
作者:sensor QQ:910731685
}
unit uJSON_Helper;interface
uses//System.Classes,//System.Types,//System.DateUtil,//System.Generics.Collections,//System.SysUtils,System.JSON;typeTJSONObjectHelper = class helper for TJSONObjectprivatefunction  Get_ValueS(PairName : string) : string;procedure Set_ValueS(PairName,PairValue : string);function  Get_ValueI(PairName : string) : Integer;procedure Set_ValueI(PairName : string; PairValue : Integer);function  Get_ValueI64(PairName : string) : Int64;procedure Set_ValueI64(PairName : string; PairValue : Int64);function  Get_ValueD(PairName : string) : TDateTime;procedure Set_ValueD(PairName : string; PairValue : TDateTime);function  Get_ValueB(PairName : string) : Boolean;procedure Set_ValueB(PairName : string; PairValue : Boolean);function  Get_ValueA(PairName : string) : TJSONArray;procedure Set_ValueA(PairName : string; PairValue : TJSONArray);function  Get_ValueO(PairName : string) : TJSONObject;procedure Set_ValueO(PairName : string; PairValue : TJSONObject);//2023-07-15function  Get_ValueExists(PairName : string) : Boolean;function  Get_ValueDelete(PairName : string) : Boolean;public//判断某个字段是否存在function PairExists(PairName : string) : Boolean;function DeletePair(PairName : string) : Boolean;  //删除某个节点,如果节点存在则返回True,否则返回False,但执行命令后,肯定节点不存在了。//定义字段读取函数property S[PairName : string] : string      read Get_ValueS   write Set_ValueS;property I[PairName : string] : integer     read Get_ValueI   write Set_ValueI;property I64[PairName : string] : Int64     read Get_ValueI64 write Set_ValueI64;property D[PairName : string] : TDateTime   read Get_ValueD   write Set_ValueD;property B[PairName : string] : Boolean     read Get_ValueB   write Set_ValueB;property A[PairName : string] : TJSONArray  read Get_ValueA   write Set_ValueA;property O[PairName : string] : TJSONObject read Get_ValueO   write Set_ValueO;//2023-07-15 增加property Exists[PairName : string] : Boolean  read Get_ValueExists;   //只读属性property Delete[PairName : string] : Boolean  read Get_ValueDelete;   //删除某个节点,如果节点存在则返回True,否则返回False,但执行命令后,肯定节点不存在了。end;implementation{ TJSONObjectHelper }function TJSONObjectHelper.Get_ValueS(PairName: string): string;
varjs : TJSONString;
beginif PairName = '' then  Exit;if Self.TryGetValue(PairName,js) thenResult := js.ValueelseResult := '';
end;function TJSONObjectHelper.PairExists(PairName: string): Boolean;
beginResult := Self.Values[PairName] <> nil;
end;procedure TJSONObjectHelper.Set_ValueS(PairName, PairValue: string);
varjs : TJSONString;
begin//1. 首先查找有没有该字段, 如果有,则直接删除if Self.TryGetValue(PairName,js) thenbeginSelf.RemovePair(PairName).Free; //如果没有free,就会产生内存泄露end;//2. 然后在增加Self.AddPair(PairName, PairValue);
end;function TJSONObjectHelper.Get_ValueI(PairName: string): Integer;
varji : TJSONNumber;
beginif PairName = '' then  Exit(0);if Self.TryGetValue(PairName,ji) thenResult := ji.AsIntelseResult := 0;
end;procedure TJSONObjectHelper.Set_ValueI(PairName: string; PairValue: Integer);
varjn : TJSONNumber;
begin//1. 首先查找有没有该字段, 如果有,则直接删除if Self.TryGetValue(PairName,jn) thenSelf.RemovePair(PairName).Free;//2. 然后在增加Self.AddPair(PairName, TJSONNumber.Create(PairValue));
end;function TJSONObjectHelper.Get_ValueD(PairName: string): TDateTime;
varji : TJSONNumber;
beginif PairName = '' then  Exit(0);if Self.TryGetValue(PairName,ji) thenResult := ji.AsDoubleelseResult := 0;
end;function TJSONObjectHelper.Get_ValueDelete(PairName: string): Boolean;
beginif not Self.PairExists(PairName) then Exit(False);Self.RemovePair(PairName).Free;Result := True;
end;function TJSONObjectHelper.Get_ValueExists(PairName: string): Boolean;
beginResult := Self.Values[PairName] <> nil;
end;procedure TJSONObjectHelper.Set_ValueD(PairName: string; PairValue: TDateTime);
varjn : TJSONNumber;
begin//1. 首先查找有没有该字段, 如果有,则直接删除if Self.TryGetValue(PairName,jn) thenSelf.RemovePair(PairName).Free;Self.AddPair(PairName, TJSONNumber.Create(PairValue));
end;function TJSONObjectHelper.Get_ValueB(PairName: string): Boolean;
varjb : TJSONBool;
beginif PairName = '' then  Exit(False);if Self.TryGetValue(PairName,jb) thenResult := jb.AsBooleanelseResult := False;
end;procedure TJSONObjectHelper.Set_ValueB(PairName: string; PairValue: Boolean);
varjb : TJSONBool;
begin//1. 首先查找有没有该字段, 如果有,则直接删除if Self.TryGetValue(PairName,jb) thenSelf.RemovePair(PairName).Free;Self.AddPair(PairName, TJSONBool.Create(PairValue));
end;function TJSONObjectHelper.Get_ValueI64(PairName: string): Int64;
varji : TJSONNumber;
beginif PairName = '' then  Exit(0);if Self.TryGetValue(PairName,ji) thenResult := ji.AsInt64elseResult := 0;
end;procedure TJSONObjectHelper.Set_ValueI64(PairName: string; PairValue: Int64);
varjn : TJSONNumber;
begin//1. 首先查找有没有该字段, 如果有,则直接删除if Self.TryGetValue(PairName,jn) thenSelf.RemovePair(PairName).Free;Self.AddPair(PairName, TJSONNumber.Create(PairValue));
end;function TJSONObjectHelper.DeletePair(PairName: string): Boolean;
beginif not Self.PairExists(PairName) then Exit(False);Self.RemovePair(PairName).Free;Result := True;
end;function TJSONObjectHelper.Get_ValueA(PairName: string): TJSONArray;
beginif PairName = '' then  Exit(nil);Self.TryGetValue(PairName,Result);
end;procedure TJSONObjectHelper.Set_ValueA(PairName: string; PairValue: TJSONArray);
varja : TJSONArray;
begin//1. 首先查找有没有该字段, 如果有,则直接删除if Self.TryGetValue(PairName,ja) thenSelf.RemovePair(PairName).Free;Self.AddPair(PairName, PairValue);
end;function TJSONObjectHelper.Get_ValueO(PairName: string): TJSONObject;
varjo : TJSONObject;
beginif PairName = '' then  Exit(nil);if Self.TryGetValue(PairName,jo) thenResult := joelseResult := nil;
end;procedure TJSONObjectHelper.Set_ValueO(PairName: string; PairValue: TJSONObject);
varjo : TJSONObject;
begin//1. 首先查找有没有该字段, 如果有,则直接删除if Self.TryGetValue(PairName,jo) thenSelf.RemovePair(PairName).Free;Self.AddPair(PairName, PairValue as TJSONObject);
end;end.

真正理解了,才知道操作的简便性!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解 JVM - 认识垃圾回收机制与类加载过程

前言 本篇通过介绍JVM是什么&#xff0c;认识JVM的内存区域的划分&#xff0c;了解类加载过程&#xff0c;JVM中垃圾回收机制&#xff0c;从中了解到垃圾回收机制中如何找到存活对象的方式&#xff0c;引用计数与可达性分析的方式&#xff0c;再释放垃圾对象时使用的方式&…

Kerberos协议详解

0x01 kerberos协议的角色组成 Kerberos协议中存在三个角色&#xff1a; 客户端(Client)&#xff1a;发送请求的一方 服务端(Server)&#xff1a;接收请求的一方 密钥分发中心(Key distribution KDC) 密钥分发中心分为两个部分&#xff1a; AS(Authentication Server)&…

Nacos (2.0版本之后)状态异常集群节点状态异常

在nacos 2.0 之后正常部署后节点状态仅有一个正常,其余均为DOWN 或者SUSPICIOUS 状态 查看日志后发现 ERROR Server check fail, please check server 192.168.172.104 ,port 9849 is available , error {} 其实是nacos 相互之间不能正常通信造成的,nacos客户端升级为2.x版…

apple pencil一代的平替有哪些品牌?苹果平板的触控笔

随着苹果Pencil系列的推出&#xff0c;平替电容笔在国内市场得到了较好的发展&#xff0c;随之的销量&#xff0c;也开始暴涨&#xff0c;苹果pencil因为价格太高&#xff0c;导致很多人买不起。目前市场上&#xff0c;有不少的平替电容笔&#xff0c;可以替代苹果的Pencil&…

MySQL 主从复制与读写分离

MySQL 主从复制与读写分离 一、mysql读写分离的概念1、什么是读写分离&#xff1f;2、为什么要读写分离呢&#xff1f;3、什么时候要读写分离&#xff1f;4、主从复制与读写分离5、mysql支持的复制类型 二、主从复制的工作过程三、MySQL 读写分离原理常见的 MySQL 读写分离分为…

【Distributed】分布式ELK日志文件分析系统(二)

文章目录 一、FilebeatELK 部署1. 环境部署2. 在 Filebeat 节点上操作2.1 安装 Filebeat2.2 设置 filebeat 的主配置文件 3. 在 Apache 节点上操作3.1 在 Logstash 组件所在节点上新建一个 Logstash 配置文件 3. 启动3.1 在Logstash 组件所在节点启动3.2 在 Filebeat 节点 启动…

Stable Diffusion 用2D图片制作3D动态壁纸

如果想让我们的2D图片动起来可以使用stable-diffusion-webui-depthmap-script插件在SD中进行加工让图片动起来。 这是一个可以从单个图像创建深度图,现在也可以生成3D立体图像对的插件,无论是并排还是浮雕。生成的结果可在3D或全息设备(如VR耳机或Looking Glass显示器)上查…

大模型加速学科升级,飞桨赋能北邮“X+大模型”特色小学期

在人工智能时代&#xff0c;设计师与产品经理比以往更加需要关注一个事实&#xff1a;那就是如何利用人工智能和数据分析技术&#xff0c;打造让用户心动的信息交互产品和用户体验&#xff0c;释放人-机协同共创的巨大潜能&#xff0c;是决定设计产能和竞争力的关键。 在产业的…

RabbitMQ ---- 消息队列

RabbitMQ ---- 消息队列 1. MQ 的相关概念1.1 什么是 MQ1.2 为什么要用 MQ1.3 MQ 的分类1.4 MQ 的选择 2. RabbitMQ2.1 RabbitMQ 的概念2.2 四大核心概念2.3 RabbitMQ 核心部分2.4 各个名词介绍2.5 安装 1. MQ 的相关概念 1.1 什么是 MQ MQ(message queue)&#xff0c;从字面…

爬虫之Scrapy

一 介绍 Scrapy一个开源和协作的框架&#xff0c;其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的&#xff0c;使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛&#xff0c;可用于如数据挖掘、监测和自动化测试等领域&#x…

什么是Docker

容器技术和虚拟机 虚拟机 和一个单纯的应用程序相比&#xff0c;操作系统是一个很重的程序&#xff0c;刚装好的系统还什么都没有部署&#xff0c;单纯的操作系统其磁盘占用至少几十G起步&#xff0c;内存要几个G起步。 在这台机器上开启三个虚拟机&#xff0c;每个虚拟机上…

PSI算法经典论文算法概述

文章目录 什么是隐私求交PSIPSI协议分类PSI算法的分类基于哈希函数的PSI算法基于不经意传输&#xff08;OT&#xff09;的 PSI算法基于GC的PSI算法基于公钥加密的PSI算法基于DH的PSI算法基于RSA盲签名的PSI算法基于同态加密的PSI算法 基于差分隐私的PSI算法 总结参考文献 什么是…

为了实现上网自由,我做了一个多功能串口服务器

项目作者&#xff1a;小华的物联网嵌入式之旅 介绍&#xff1a;从事电气自动化行业&#xff0c;多次获得物联网设计竞赛&#xff0c;爱好嵌入式设计开发&#xff0c;物联网开发。 设计方案思路的由来&#xff0c;是因为我们现在的开发板基本需要通过串口与WIFI模组或以太网模…

[Linux] 最基础简单的线程池 及其 单例模式的实现

本篇文章主要用到线程相关内容, 下面是博主关于线程相关内容的文章: [Linux] 线程同步分析&#xff1a;什么是条件变量&#xff1f;生产者消费者模型是什么&#xff1f;POSIX信号量怎么用&#xff1f;阻塞队列和环形队列模拟生产者消费者模型 [Linux] 线程互斥分析: 多线程的问…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(一)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

华为发布大模型时代AI存储新品

7月14日&#xff0c;华为发布大模型时代AI存储新品&#xff0c;为基础模型训练、行业模型训练&#xff0c;细分场景模型训练推理提供存储最优解&#xff0c;释放AI新动能。 企业在开发及实施大模型应用过程中&#xff0c;面临四大挑战&#xff1a; 首先&#xff0c;数据准备时…

剑指offer刷题笔记--Num41-50

1--数据流中的中位数&#xff08;41&#xff09; 主要思路&#xff1a; 维护两个优先队列&#xff0c;Q1大数优先&#xff0c;存储比中位数小的数&#xff1b;Q2小数优先&#xff0c;存储比中位数大的数&#xff1b; 当存储的数为偶数时&#xff0c;Q1.size() Q2.size(), 中位…

解决github无法拉取submodule子模块的问题

引言 当使用git clone --recursive url 拉取一个配置了子模块的仓库后&#xff0c;会卡住。 同时在使用git clone 拉去https的url时&#xff0c;同样可能会出现一直卡在cloning int reposity...本文提供一个简单的脚本来解决该问题。 前置准备 需要配置好git的相关配置&…

快速配置 Rust 开发环境并编写一个小应用

安装: curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 更新: Rust 的升级非常频繁. 如果安装 Rustup 后已有一段时间,那么很可能 Rust 版本已经过时, 运行 rustup update 获取最新版本的 Rust rustc&#xff1a;编译Rust程序 rustc只适合简单的Rust程序&#xf…

qt和vue的交互

1、首先在vue项目中引入qwebchannel /******************************************************************************** Copyright (C) 2016 The Qt Company Ltd.** Copyright (C) 2016 Klarlvdalens Datakonsult AB, a KDAB Group company, infokdab.com, author Milian …