导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2018/6/16 11:59:36
标题:
Delphi Sysem.JSON 链式写法
浏览:5801
加入我的收藏
楼主:
链式写法有很多优点:连贯、语意集中、简洁、一气呵成、可读性强。比如要把 3.1415926 中的 59 提取为一个整数:Pi.ToString().Substring(5,2).ToInteger() 轻车熟路的感觉,让人觉得,哇!好帅的写法,牛x! 以前以为只有 TJSONBuilder 才支持链式语法,今天发现 TJSONObject 也支持,比如要生成下面的 JSON : { "name": "张三", "vip": true, "telephones": [ "13012345678", "19786543210" ], "age": 24, "size": 1.72, "adresses": [ { "adress": "foo", "city": "The wall", "pc": 57000 }, { "adress": "foo", "city": "Winterfell", "pc": 44000 } ] } 使用 TJSONObject 链式写法,代码如下: var JsonObject:TJSONObject; begin JsonObject:= TJSONObject.Create; JsonObject .AddPair('name', TJSONString.Create('张三')) .AddPair('vip', TJSONTrue.Create) .AddPair('telephones', TJSONArray.Create .Add('13012345678') .Add('19786543210') ) .AddPair('age', TJSONNumber.Create(24)) .AddPair('size', TJSONNumber.Create(1.72)) .AddPair('adresses', TJSONArray.Create .Add( TJSONObject.Create .AddPair('adress', 'foo') .AddPair('city', 'The wall') .AddPair('pc', TJSONNumber.Create(57000)) ) .Add( TJSONObject.Create .AddPair('adress', 'foo') .AddPair('city', 'Winterfell') .AddPair('pc', TJSONNumber.Create(44000)) ) ); Memo1.Text := TConverters.JsonReformat(JsonObject.ToJSON); end; Delphi 10.1 新增的一个JSON读写框架 : Readers and Writers JSON Framework 有兴趣可以了解下,下面是使用 TJSONObjectBuilder 的写法: Builder:=TJSONObjectBuilder.NewBuilder; Builder .BeginObject .Add('name','张三') .Add('vip',true) .BeginArray('telephones') .Add('13012345678') .Add('19786543210') .EndArray .Add('age',24) .Add('size',1.72) .BeginArray('adresses') .BeginObject .Add('adress','foo') .Add('city','The wall') .Add('pc',57000) .EndObject .BeginObject .Add('adress','foo') .Add('city','Winterfell') .Add('pc',44000) .EndObject .EndArray .EndObject; Memo1.Text := Builder.ToJSON; 不过,个人认为,使用 TJSONBuilder 层次更分明,更优雅。
此帖子包含附件: 大小: 106.2K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2018/6/16 13:09:50
1楼:
学习了
----------------------------------------------
-
作者:
2018/6/16 13:36:00
2楼:
学习了
----------------------------------------------
-
作者:
2018/6/16 21:57:06
3楼:
厉害啊
----------------------------------------------
-
作者:
2018/6/18 16:27:27
4楼:
非常棒啊。
----------------------------------------------
Delphi 的移动程序开发,是您不可再错失的机遇:http://blog.163.com/you888@188/blog/static/6723961920169319529515/
作者:
2018/6/18 16:38:58
5楼:
看起来像是inline的写法,中间可以插入控制语句么?比如 Builder:=TJSONObjectBuilder.NewBuilder; Builder .BeginObject for m:=0 to 10 do begin ...... end; .....
----------------------------------------------
-
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2018/6/19 6:57:07
6楼:
多谢全能!
----------------------------------------------
-我的博客
作者:
2018/6/19 8:38:29
7楼:
这个写法 在第一版jsonobject出来的时候demo就这样写过了。主要就是因为,他的方法 都是返回json对象self,没什么奇怪
----------------------------------------------
-
作者:
jiuk (愛像一陣風)
★☆☆☆☆
-
普通会员
2018/6/19 15:46:22
8楼:
earthsbest (全能中间件) 你这个能在写一个读的吗,最近要用,发现深层次的读不出来没办法用pos 和 copy来解决的
----------------------------------------------
Delphi业余爱好者
作者:
2018/6/19 16:25:29
9楼:
@楼上,看这里 http://bbs.2ccc.com/topic.asp?topicid=539150
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2018/6/20 0:15:00
10楼:
请教下TConverters 在哪个单元有?
----------------------------------------------
-
作者:
2018/6/20 8:58:42
11楼:
不错,学习了
----------------------------------------------
-
作者:
2018/6/20 12:59:39
12楼:
@10楼,\Samples\Object Pascal\RTL\Json\Converters.pas 格式化 JSON 而已,不用它不影响功能。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2018/6/20 17:19:16
13楼:
好的,谢谢
----------------------------------------------
-
作者:
2019/2/21 18:13:35
14楼:
链式写法
----------------------------------------------
-
作者:
2019/2/22 9:22:18
15楼:
@bbnn38 Delphi 10.3 的 Json 有格式化功能了,JsonObject.Format。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/3/20 14:31:18
16楼:
@ kentty 可以插入控制语句,速度超级快。 with Builder.BeginObject do begin Add('name', '张三') ; Add('vip', true); with BeginArray('telephones') do begin for var I:=0 to 3 do Add('13012345678'); EndArray; end; Add('age', 24) ; Add('size', 1.72) ; with BeginArray('adresses') do begin for var I:= 0 to 3 do begin with BeginObject do begin Add('adress', 'foo') ; Add('city', '合肥'); Add('pc', 57000); EndObject; end; end; EndArray; end; EndObject; end; Memo1.Text := Builder.ToJSON;
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2020/5/15 12:06:14
17楼:
https://jsontodelphi.com/ 有意思的网站 av了.
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
2020/5/15 12:31:18
18楼:
为链式而链式 实际上TJsonObject.ParseJSONValue('"key":"value"}') as TJsonObject这样它不香吗
----------------------------------------------
-
作者:
2020/5/16 9:10:34
19楼:
666666
此帖子包含附件: 大小: 54.1K
----------------------------------------------
-
作者:
2020/5/16 9:45:17
20楼:
学习
----------------------------------------------
-
作者:
2020/10/23 8:21:33
21楼:
unit uJSonBuilder; interface uses System.Classes, System.SysUtils, System.JSON, System.JSON.Types, System.JSON.Writers, System.JSON.Readers, System.JSON.Builders; type TJSONBuilder = class(TJSONObjectBuilder) //单实例类 private StringBuilder : TStringBuilder; StringWriter : TStringWriter; JSONTextWriter: TJsonTextWriter; class var FJSONBuilder: TJSONBuilder; class function GetJSON: string; static; public class property JSON: String read GetJSON; constructor Create(const AFormatting: TJsonFormatting = TJsonFormatting.None); destructor Destroy; override; end; implementation constructor TJSONBuilder.Create(const AFormatting: TJsonFormatting); begin if FJSONBuilder <> nil then FJSONBuilder.Free; //只保持单实例 StringBuilder := TStringBuilder.Create; StringWriter := TStringWriter.Create(StringBuilder); JSONTextWriter := TJsonTextWriter.Create(StringWriter); JSONTextWriter.Formatting := AFormatting; inherited Create(JSONTextWriter); FJSONBuilder := Self; end; destructor TJSONBuilder.Destroy; begin inherited; StringBuilder.Free; StringWriter.Free; JSONTextWriter.Free; FJSONBuilder := nil; end; class function TJSONBuilder.GetJSON: string; begin if FJSONBuilder = nil then Result := '' else Result := FJSONBuilder.StringBuilder.ToString; end; initialization TJSONBuilder.FJSONBuilder := nil; finalization if TJSONBuilder.FJSONBuilder <> nil then TJSONBuilder.FJSONBuilder.Free; end.
----------------------------------------------
-
作者:
2020/10/23 8:23:57
22楼:
uses uJSONBuilder, System.JSON.Builders; procedure TForm1.ButtonShowClick(Sender: TObject); begin TJSONBuilder.Create .BeginObject .Add('touser', 'BigCat') .Add('msgtype', 'text') .BeginObject('消息') .Add('title' , '快递通知') .Add('content', '你的快递已到,请携带工卡前往邮件中心领取。') .EndObject .BeginArray('快递物品清单') .BeginObject .Add('图书数', 3) .EndObject .BeginObject .Add('手机数', 3) .EndObject .EndArray .Add('agentid', 1000002) .EndObject; ShowMessage(TJSONBuilder.JSON); TJSONBuilder.Create .BeginObject .BeginArray('考试成绩') .BeginObject .Add('姓名', '张三') .Add('成绩', 100.0 ) .EndObject .BeginObject .Add('姓名', '李四') .Add('成绩', 59.9 ) .EndObject .EndArray .EndObject; ShowMessage(TJSONBuilder.JSON); end;
----------------------------------------------
-
作者:
2020/10/23 8:25:32
23楼:
这里实现的JSON构建类TJSONBuilder最多只允许存在一个实例,每次执行TJSONBuilder.Create时都会自动清除掉上一次创建的实例,程序关闭时也会自动清除最后创建的实例, 因此使用这个类不需要考虑内存释放的问题
----------------------------------------------
-
作者:
2020/10/23 9:05:56
24楼:
帅的掉渣。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..