DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 9
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
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 层次更分明,更优雅。
此帖子包含附件:
PNG 图像
大小:106.2K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 kevinsui (sui) ★☆☆☆☆ -
盒子活跃会员
2018/6/16 13:09:50
1楼: 学习了
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2018/6/16 13:36:00
2楼: 学习了
----------------------------------------------
-
作者:
男 wojiaohaoyaping (我叫郝亚平) ▲▲▲▲△ -
普通会员
2018/6/16 21:57:06
3楼: 厉害啊
----------------------------------------------
-
作者:
男 gaoyong_gy (gaoyong_gy) ★☆☆☆☆ -
盒子活跃会员
2018/6/18 16:27:27
4楼: 非常棒啊。
----------------------------------------------
Delphi 的移动程序开发,是您不可再错失的机遇:http://blog.163.com/you888@188/blog/static/6723961920169319529515/
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
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楼: 多谢全能!
----------------------------------------------
-我的博客
作者:
男 cuit_xiong (熊猫) ★☆☆☆☆ -
普通会员
2018/6/19 8:38:29
7楼: 这个写法 在第一版jsonobject出来的时候demo就这样写过了。主要就是因为,他的方法 都是返回json对象self,没什么奇怪
----------------------------------------------
-
作者:
男 jiuk (愛像一陣風) ★☆☆☆☆ -
普通会员
2018/6/19 15:46:22
8楼: earthsbest (全能中间件) 你这个能在写一个读的吗,最近要用,发现深层次的读不出来没办法用pos 和 copy来解决的
----------------------------------------------
Delphi业余爱好者
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2018/6/19 16:25:29
9楼: @楼上,看这里 http://bbs.2ccc.com/topic.asp?topicid=539150
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 bbnn38 (伟大的咸鱼) ★☆☆☆☆ -
普通会员
2018/6/20 0:15:00
10楼: 请教下TConverters 在哪个单元有?
----------------------------------------------
-
作者:
男 gong123456 (DELPHI先生) ★☆☆☆☆ -
普通会员
2018/6/20 8:58:42
11楼: 不错,学习了
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
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
作者:
男 bbnn38 (伟大的咸鱼) ★☆☆☆☆ -
普通会员
2018/6/20 17:19:16
13楼: 好的,谢谢
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2019/2/21 18:13:35
14楼: 链式写法
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/2/22 9:22:18
15楼: @bbnn38  Delphi 10.3 的 Json 有格式化功能了,JsonObject.Format。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
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
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
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/
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2020/5/15 12:31:18
18楼: 为链式而链式

实际上TJsonObject.ParseJSONValue('"key":"value"}') as TJsonObject这样它不香吗
----------------------------------------------
-
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2020/5/16 9:10:34
19楼: 666666
此帖子包含附件:
PNG 图像
大小:54.1K
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2020/5/16 9:45:17
20楼: 学习
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
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.
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
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;
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2020/10/23 8:25:32
23楼: 这里实现的JSON构建类TJSONBuilder最多只允许存在一个实例,每次执行TJSONBuilder.Create时都会自动清除掉上一次创建的实例,程序关闭时也会自动清除最后创建的实例, 因此使用这个类不需要考虑内存释放的问题
----------------------------------------------
-
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2020/10/23 9:05:56
24楼: 帅的掉渣。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行82.03125毫秒 RSS