我曾有讲过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.
真正理解了,才知道操作的简便性!