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

news2024/11/20 10:29:26

        

 

        我曾有讲过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

uses
  uJSON_Helper;

var
  jo : TJSONObject;
  S  : string;
  sName : string;
  iAge  : Integer;
  bSex  : Boolean;
  sBirth: string;
  iSalary : Int64;
  sHobby1 : string;
begin
  jo := 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'];   //sensor
    iAge  := jo.I['age'];    //57
    bSex  := jo.B['sex'];    //True
    sBirth:= FormatDateTime('YYYY-MM-DD',jo.D['Birth']);  // 1970-02-13
    iSalary:= jo.O['workplace'].I64['salary'];   // 9223372036854775807

    sHobby1 := jo.A['hobbies'].Items[0].Value;    // 乒乓球

    //删除操作
    jo.DeletePair('sex');     // 删除性别 函数法
    jo.Delete['sex'];         // 删除性别 数组法

    S := jo.Format;
   
  finally
    jo.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-18
      2023-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;

type
  TJSONObjectHelper = class helper for TJSONObject
    private
       function  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-15
       function  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;
var
  js : TJSONString;
begin
  if PairName = '' then  Exit;

  if Self.TryGetValue(PairName,js) then
     Result := js.Value
  else
     Result := '';
end;

function TJSONObjectHelper.PairExists(PairName: string): Boolean;
begin
  Result := Self.Values[PairName] <> nil;
end;



procedure TJSONObjectHelper.Set_ValueS(PairName, PairValue: string);
var
  js : TJSONString;
begin
  //1. 首先查找有没有该字段, 如果有,则直接删除
  if Self.TryGetValue(PairName,js) then
     begin
       Self.RemovePair(PairName).Free; //如果没有free,就会产生内存泄露
     end;
  //2. 然后在增加
  Self.AddPair(PairName, PairValue);
end;

function TJSONObjectHelper.Get_ValueI(PairName: string): Integer;
var
  ji : TJSONNumber;
begin
  if PairName = '' then  Exit(0);

  if Self.TryGetValue(PairName,ji) then
     Result := ji.AsInt
  else
     Result := 0;
end;

procedure TJSONObjectHelper.Set_ValueI(PairName: string; PairValue: Integer);
var
  jn : TJSONNumber;
begin
  //1. 首先查找有没有该字段, 如果有,则直接删除
  if Self.TryGetValue(PairName,jn) then
     Self.RemovePair(PairName).Free;
  //2. 然后在增加
  Self.AddPair(PairName, TJSONNumber.Create(PairValue));
end;

function TJSONObjectHelper.Get_ValueD(PairName: string): TDateTime;
var
  ji : TJSONNumber;
begin
  if PairName = '' then  Exit(0);

  if Self.TryGetValue(PairName,ji) then
     Result := ji.AsDouble
  else
     Result := 0;
end;

function TJSONObjectHelper.Get_ValueDelete(PairName: string): Boolean;
begin
  if not Self.PairExists(PairName) then Exit(False);
  Self.RemovePair(PairName).Free;
  Result := True;
end;

function TJSONObjectHelper.Get_ValueExists(PairName: string): Boolean;
begin
  Result := Self.Values[PairName] <> nil;
end;

procedure TJSONObjectHelper.Set_ValueD(PairName: string; PairValue: TDateTime);
var
  jn : TJSONNumber;
begin
  //1. 首先查找有没有该字段, 如果有,则直接删除
  if Self.TryGetValue(PairName,jn) then
     Self.RemovePair(PairName).Free;
  Self.AddPair(PairName, TJSONNumber.Create(PairValue));
end;


function TJSONObjectHelper.Get_ValueB(PairName: string): Boolean;
var
  jb : TJSONBool;
begin
  if PairName = '' then  Exit(False);

  if Self.TryGetValue(PairName,jb) then
     Result := jb.AsBoolean
  else
     Result := False;
end;

procedure TJSONObjectHelper.Set_ValueB(PairName: string; PairValue: Boolean);
var
  jb : TJSONBool;
begin
  //1. 首先查找有没有该字段, 如果有,则直接删除
  if Self.TryGetValue(PairName,jb) then
     Self.RemovePair(PairName).Free;
  Self.AddPair(PairName, TJSONBool.Create(PairValue));
end;


function TJSONObjectHelper.Get_ValueI64(PairName: string): Int64;
var
  ji : TJSONNumber;
begin
  if PairName = '' then  Exit(0);

  if Self.TryGetValue(PairName,ji) then
     Result := ji.AsInt64
  else
     Result := 0;
end;


procedure TJSONObjectHelper.Set_ValueI64(PairName: string; PairValue: Int64);
var
  jn : TJSONNumber;
begin
  //1. 首先查找有没有该字段, 如果有,则直接删除
  if Self.TryGetValue(PairName,jn) then
     Self.RemovePair(PairName).Free;
  Self.AddPair(PairName, TJSONNumber.Create(PairValue));
end;





function TJSONObjectHelper.DeletePair(PairName: string): Boolean;
begin
  if not Self.PairExists(PairName) then Exit(False);
  Self.RemovePair(PairName).Free;
  Result := True;
end;

function TJSONObjectHelper.Get_ValueA(PairName: string): TJSONArray;
begin
  if PairName = '' then  Exit(nil);

  Self.TryGetValue(PairName,Result);
end;





procedure TJSONObjectHelper.Set_ValueA(PairName: string; PairValue: TJSONArray);
var
  ja : TJSONArray;
begin
  //1. 首先查找有没有该字段, 如果有,则直接删除
  if Self.TryGetValue(PairName,ja) then
     Self.RemovePair(PairName).Free;

  Self.AddPair(PairName, PairValue);
end;


function TJSONObjectHelper.Get_ValueO(PairName: string): TJSONObject;
var
  jo : TJSONObject;
begin
  if PairName = '' then  Exit(nil);

  if Self.TryGetValue(PairName,jo) then
     Result := jo
  else
     Result := nil;
end;

procedure TJSONObjectHelper.Set_ValueO(PairName: string; PairValue: TJSONObject);
var
  jo : TJSONObject;
begin
  //1. 首先查找有没有该字段, 如果有,则直接删除
  if Self.TryGetValue(PairName,jo) then
     Self.RemovePair(PairName).Free;
  Self.AddPair(PairName, PairValue as TJSONObject);
end;

end.

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

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

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

相关文章

51. N 皇后 (递归+回溯)

题目链接&#xff1a;力扣 解题思路&#xff1a;递归回溯&#xff0c;n个皇后不能在同一行&#xff0c;同一列&#xff0c;同一斜线上&#xff0c;需要将n个皇后放在n*n的棋盘上&#xff0c;所以棋盘的每一行一定有一个皇后&#xff0c;因此可以第一行开始&#xff0c;在当前行…

计算机毕设 大数据电商用户行为分析及可视化

文章目录 1. 数据集说明2. 数据处理2.1 数据导入2.2 数据清洗 3.数据分析可视化3.1 用户流量及购物情况3.2 用户行为转换率3.3 用户行为习惯3.4 基于 RFM 模型找出有价值的用户3.5 商品维度的分析 4 最后 1. 数据集说明 这是一份来自淘宝的用户行为数据&#xff0c;时间区间为…

大数据分析平台能为企业带来哪些好处_光点科技

大数据分析平台是近年来迅速发展的一项关键技术&#xff0c;它利用先进的数据处理和分析技术&#xff0c;帮助企业从海量数据中提取有价值的信息和见解。对于企业来说&#xff0c;拥有一个强大的大数据分析平台可以带来许多好处。 首先&#xff0c;大数据分析平台可以帮助企业更…

【ArcGIS微课1000例】0070:制作宾馆酒店分布热度热力图

本文讲解在ArcGIS中,基于长沙市酒店宾馆分布矢量点数据(POI数据)绘制酒店分布热力图。 相关阅读: 【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图 【ArcGIS Pro微课1000例】0028:绘制酒店分布热力图(POI数据) 文章目录 一、加载宾馆分布数据二、绘制热度图一、加载宾…

[QT编程系列-11]:C++图形用户界面编程,QT框架快速入门培训 - 5- QT主要控件与自定义控件

目录 5. QT主要控件 5.1 预定义控件 5.2 自定义控件 5.3 用预定义容器橙子和提升自定义控件 5.3 后记 5. QT主要控件 5.1 预定义控件 在Qt中&#xff0c;有许多预定义的控件&#xff08;Widgets&#xff09;可用于创建用户界面。这些控件提供了各种常见的用户界面元素&am…

五笔没落之五笔学习热潮

1998年&#xff0c;一个风雨交加的下午&#xff0c;有一个年轻人骑着一辆破旧的自行车来到电脑培训班&#xff0c;学习五笔打字。那时电脑还很贵&#xff0c;他一个月的工资只有几百元&#xff0c;根本买不起电脑&#xff0c;所以选择参加培训班。那时会打字就像现在的硕士生那…

Java----Nacos服务注册

除了通过Eureka&#xff0c;还可以通过我们的Nacos进行注册服务&#xff0c;方法也很简单。 前提&#xff01;需要开启Nacos服务&#xff0c;在官网中下载对应的压缩包&#xff0c;然后启动&#xff0c;如下windows需要输入命令&#xff1a; startup.cmd -m standalone 然后会…

Qt+C++多线程thread-QThread-QTimer视频-控件动画-混合应用实例

程序示例精选 QtC多线程thread-QThread-QTimer混合应用实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC多线程thread-QThread-QTimer混合应用实例>>编写代码&#xff0c…

事务@transactional执行产生重复数据

背景 系统设计之初&#xff0c;每次来新请求&#xff0c;业务层会先查询数据库&#xff0c;判断是否存在相同的id数据&#xff08;id是唯一标识产品的&#xff09;&#xff0c;有则返回当前数据库查到的数据&#xff0c;根据数据决定下一步动作&#xff0c;没有则认为是初次请…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…

火山引擎徐广治:边缘云,下一代云计算

6月30日&#xff0c;2023稀土开发者大会在北京举办。大会以「代码不止&#xff0c;掘金不停」为主题&#xff0c;与上百位海内外技术专家一起剖析行业最新动态&#xff0c;为一直在路上的技术开发者们&#xff0c;拓宽技术视野&#xff0c;传播前沿的技术理念。火山引擎边缘云资…

图腾柱电路

驱动MOS或者IGBT管&#xff0c;需要比较大的驱动电流或者灌电流 使用图腾柱电路或许是一个好的办法 电流路径是这样的 当CTL1端口输出为高电平的时候 三极管Q2的2脚为高&#xff0c;三极管Q2不导通 三极管Q1的2脚为高&#xff0c;三极管导通 所以Q1的3脚和1脚导通 VCC--…

C++笔记(总)

15重载 为什么使用重载 可以让函数名相同 提高复用性 函数重载需要满足的条件 1.函数的作用域相同 2.函数的返回值相同 3.函数的参数类型不同,或者参数的个数不相同或者参数的顺序不相同或者参数的类型不相同 4.不能用函数的返回值作为判断重载判断的条件。 举个例子 根…

月薪9.8K!打破年龄瓶颈~30岁前台测试转后台优化,他说:未来可期!

海压竹枝低复举&#xff0c;风吹山角晦还明&#xff01; 是啊&#xff0c;人这一辈子&#xff0c;该走的弯路&#xff0c;该吃的苦&#xff0c;该撞的南墙&#xff0c;一样都少不了&#xff0c;但只要我们能坚强挺住&#xff0c;熬过去&#xff0c;跨过去&#xff0c;好运自然来…

《Python机器学习:基于PyTorch和Scikit-Learn》——小解送书第五期

目录 书籍介绍 内容简介 作者简介 参与抽奖 书籍介绍 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来…

【踩坑】gin框架middleware中间件如何中途跳出

gin框架middleware中间件如何中途跳出 背景 我在是使用gin web框架的时候需要自定义鉴权方式&#xff0c;那当然就要用到middleware这个方式了&#xff0c;代码如下所示&#xff0c;需要判断uid和token是否合法&#xff0c;不合法直接返回401状态&#xff0c;不继续往下执行 …

Android JNI引用类型管理 (十)

🔥 Android Studio 版本 🔥 🔥 JNI三种引用类型 🔥 全局引用、局部引用、弱引用 如果使用得当可以提升程序的性能, 否则会造成程序崩溃或者内存泄漏 🔥 创建包含JNI的类 JNIReference.java 🔥 package com.cmake.ndk1.jni;public class JNIReference {static {S…

什么是分布式微服务?

什么是分布式微服务&#xff1f; 前言什么是微服务举例说明 什么是分布式图解分布式与微服务单体架构及部署微服务架构分布式影响 分布式微服务架构什么是分布式微服务架构面临的问题 前言 本文旨在讲清楚什么是分布式微服务架构&#xff0c;通过解释微服务架构和分布式架构&a…

基于Java+SpringBoot+Vue的乐器社区网站设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

37.SpringBoot实用篇—开发(上册)

目录 一、SpringBoot实用篇—开发。 &#xff08;1&#xff09;热部署&#xff08;开发阶段使用&#xff09;。 &#xff08;1.1&#xff09;手动启动热部署。 &#xff08;1.2&#xff09;自动启动热部署。 &#xff08;1.3&#xff09;热部署范围配置。 &#xff08;1.…