DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: g22800
今日帖子: 20
在线用户: 29
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 emailx45 (emailx45) ▲▲▲△△ -
注册会员
2019/11/9 13:31:08
标题:
Reading JSON File using TJSONIterator, TJSONTokens and TJSONTextReader classes - Easy mode! 浏览:286
加入我的收藏
楼主: Here my sample for read a JSON file structure using TJSONIterator class, of easy way!

Minimizing code is always good! Your system thanks you!

按此在新窗口浏览图片


https://www.mirrored.to/files/NHFWEQDZ/MyConanExiles_JSON_FILE_READER.zip_links

hug
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲△△ -
注册会员
2020/2/28 2:23:13
1楼: unit uFormMain;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls,
  Vcl.ExtCtrls,
  Vcl.ExtDlgs,
  Vcl.Buttons;

type
  TForm1 = class(TForm)
    btnProcessJSONParse_File_TXT: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Panel1: TPanel;
    OpenTextFileDialog1: TOpenTextFileDialog;
    btnProcessJSONParse_Memo: TButton;
    Memo3: TMemo;
    procedure FormResize(Sender: TObject);
    procedure btnProcessJSONParse_File_TXTClick(Sender: TObject);
    procedure btnProcessJSONParse_MemoClick(Sender: TObject);
  private
    procedure prcMyLogMemo(const lText: string);
    procedure prcMyJSONParse(const lFileName: string; lFileOrMemo: Boolean = True);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  System.TypInfo, {Enumerated Type info}
  System.JSON.Types, {TJSONTokens}
  System.JSON.Builders, {TJSONIterator}
  System.JSON.Readers {TJSONTextReader}
    ;

function fncJSONTokenToString(lJInterator: TJSONIterator): string;
begin
  result := EmptyStr;
  result := GetEnumName(TypeInfo(TJsonToken), ord(lJInterator.&Type)); // same resulted below!
  //
{$REGION 'REGION: tests for "Info about type"'}
  (*
    case lJInterator.&Type of { for tests... unnecessary on real app! }
    TJsonToken.None:
    result := 'None';
    TJsonToken.StartObject:
    result := 'StartObject';
    TJsonToken.StartArray:
    result := 'StartArray';
    TJsonToken.StartConstructor:
    result := 'StartConstructor';
    TJsonToken.PropertyName:
    result := 'PropertyName';
    TJsonToken.Comment:
    result := 'Comment';
    TJsonToken.Raw:
    result := 'Raw';
    TJsonToken.Integer:
    result := 'Integer';
    TJsonToken.Float:
    result := 'Float';
    TJsonToken.String:
    result := 'String';
    TJsonToken.Boolean:
    result := 'Boolean';
    TJsonToken.Null:
    result := 'Null';
    TJsonToken.Undefined:
    result := 'Undefined';
    TJsonToken.EndObject:
    result := 'EndObject';
    TJsonToken.EndArray:
    result := 'EndArray';
    TJsonToken.EndConstructor:
    result := 'EndConstructor';
    TJsonToken.Date:
    result := 'Date';
    TJsonToken.Bytes:
    result := 'Bytes';
    TJsonToken.Oid: { Only in Extended JSON, BSON }
    result := 'Oid';
    TJsonToken.RegEx: { Only in Extended JSON, BSON }
    result := 'RegEx';
    TJsonToken.DBRef: { Only in Extended JSON, BSON }
    result := 'DBRef';
    TJsonToken.CodeWScope: { Only in Extended JSON, BSON }
    result := 'CodeWScope';
    TJsonToken.MinKey: { Only in Extended JSON, BSON }
    result := 'MinKey';
    TJsonToken.MaxKey: { Only in Extended JSON, BSON }
    result := 'MaxKey';
    end;
  *)
{$ENDREGION}
end;

procedure TForm1.btnProcessJSONParse_File_TXTClick(Sender: TObject);
begin
  // Setup to my OpenTextFileDialog:
  OpenTextFileDialog1.Title := 'Choice the JSON file';
  OpenTextFileDialog1.Files.Add('Text Files|*.txt');
  OpenTextFileDialog1.DefaultExt := 'txt';
  OpenTextFileDialog1.InitialDir := '..\..';
  { ExtractFileDir(Application.ExeName); //This function works for multi-byte character systems (MBCS) }
  //
  if OpenTextFileDialog1.Execute() then
  begin
    Memo1.Lines.Clear;
    prcMyJSONParse(OpenTextFileDialog1.FileName, True);
  end;
end;

procedure TForm1.btnProcessJSONParse_MemoClick(Sender: TObject);
begin
  Memo1.Lines.Clear;
  prcMyJSONParse(OpenTextFileDialog1.FileName, False);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Memo1.Width := ClientWidth div 2;
  Memo2.Width := ClientWidth div 2;
end;

procedure TForm1.prcMyJSONParse(const lFileName: string; lFileOrMemo: Boolean = True);
var
  i: Integer;
  lObjectsOnJSON: Integer;
  lHaveMore: Boolean;
  lIsStartingNewObjects: Boolean;
  //
  lJInterator: TJSONIterator;
  lJSTextReader: TJSONTextReader;
  lStringReader: TStringReader;
begin
  i := 0;
  lObjectsOnJSON := 0;
  lHaveMore := True;
  lIsStartingNewObjects := True;
  //
  lJInterator := nil; // always init it!
  lJSTextReader := nil;
  lStringReader := nil;
  //
  if lFileOrMemo then
    Memo2.Lines.LoadFromFile(lFileName);
  //
  // start the procedure with my JSON text: (basic class, but you can use any other similar)
  lStringReader := TStringReader.Create(Memo2.Lines.Text);
  lJSTextReader := TJSONTextReader.Create(lStringReader);
  lJInterator := TJSONIterator.Create(lJSTextReader);
  //
  try
    while lHaveMore do // you can change for your own use and risk! :)
    begin
      try
        Inc(i); // my counter for tests!
        //
        if (lJInterator.&Type = TJsonToken.StartObject) then
          Inc(lObjectsOnJSON);
        //
        lIsStartingNewObjects := lJInterator.&Type in [ { TJsonToken.StartConstructor, } TJsonToken.StartArray, TJsonToken.StartObject];

        //
        // if (not lIsStartingNewObjects) and (lJInterator.&Type <> TJsonToken.None) then { for tests... }
        prcMyLogMemo( { }
          Format('%.4d, Depth=%.2d, Index=%.2d, %s, Key=%s, Path=%s, Value=%s', [ { }
          i, { }
          lJInterator.Depth, { }
          lJInterator.Index, { }
          fncJSONTokenToString(lJInterator), { }
          lJInterator.Key, { }
          lJInterator.Path, { }
          lJInterator.AsValue.ToString { generic way for all values possible! }
          ]) { }
          ); // logMemo
        //
        if lIsStartingNewObjects then
          lJInterator.Recurse; // necessary always start a new Array/Object
        //
        lHaveMore := lJInterator.Next; // have more items? (array/object)
        //
        if not lHaveMore then // is the end?
        begin
          lJInterator.Return; // go back level before
          lJInterator.Recurse; // enter on new array/object
          lHaveMore := True; // yeah! more items...
        end;
        //
        if lJInterator.Depth = 0 then // if level is "0", then, no more items!
          lHaveMore := False;
        //
        if lJInterator.&Type = TJsonToken.StartObject then
          prcMyLogMemo(Format('---------- Object #%.2d ----------', [lObjectsOnJSON]));
        //
      except
        on E: EJsonReaderException do
        begin
          ShowMessage('E: EJsonReaderException'#13#10 + E.Message);
          Exit;
        end;
        on E: Exception do
        begin
          ShowMessage('E: Exception'#13#10 + E.ToString);
          Exit;
        end;
      end;
    end;
  finally
    lJInterator.Free;
    lJSTextReader.Free;
    lStringReader.Free;
    //
    prcMyLogMemo('----------');
    prcMyLogMemo('How many object on JSON: ' + lObjectsOnJSON.ToString);
    //
  end;
end;

procedure TForm1.prcMyLogMemo(const lText: string);
begin
  Memo1.Lines.Add(lText);
end;

end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲△△ -
注册会员
2020/2/28 2:24:09
2楼: project RAD Rio

https://www85.zippyshare.com/v/XnA1X6Sw/file.html
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行42.96875毫秒 RSS