返回文章列表

Delphi JSON XML 資料處理技巧

本文深入探討 Delphi 中處理 JSON 和 XML 資料的技巧,涵蓋 Fluent Builders 生成 JSON、JSON Data Binding Wizard 自動物件對映、TXMLDocument 處理 XML,以及 XML Data Binding Wizard 的應用。這些技術能幫助 Delphi

Delphi 資料處理

Delphi 提供了多元的 JSON 與 XML 資料處理方法,Fluent Builders 可讀性高,讓程式碼更貼近 JSON 結構。TJSONObject 和 TJsonTextReader 則分別對應 DOM 和串流解析方式,滿足不同情境需求。XML 處理方面,TXMLDocument 提供穩定的解析功能,而 XML Data Binding Wizard 則能簡化物件對映,減少程式碼撰寫負擔。這些工具的搭配使用,能大幅提升 Delphi 應用程式在資料處理方面的效率。

Delphi 中的 JSON 與 XML 資料處理技巧

Delphi 為開發者提供了多種處理 JSON 和 XML 資料的方法。本文將深入探討使用 Fluent Builders 生成 JSON 資料、JSON Data Binding Wizard 自動生成物件對映、TXMLDocument 處理 XML 資料,以及 XML Data Binding Wizard 的應用。這些技術將幫助開發者更高效地處理資料交換和儲存。

使用 Fluent Builders 生成 JSON 資料

Fluent Builders 是 Delphi 中一種生成 JSON 資料的方法,其特點是使程式碼結構更貼近最終生成的 JSON 格式。這種方法的優勢在於其可讀性和可維護性。

Fluent Builders 的實作範例

uses
  System.JSON.Builders;

function GenerateJsonWithBuilder: string;
var
  StringWriter: TStringWriter;
  Writer: TJsonTextWriter;
  Builder: TJSONObjectBuilder;
begin
  StringWriter := TStringWriter.Create();
  Writer := TJsonTextWriter.Create(StringWriter);
  Builder := TJSONObjectBuilder.Create(Writer);
  try
    Writer.Formatting := TJsonFormatting.Indented;
    Builder
      .BeginObject
      .BeginArray('Favorites')
      .BeginObject
      .Add('Caption', 'Delphi Home Page')
      .Add('URL', 'https://www.embarcadero.com/products/delphi')
      .EndObject
      .BeginObject
      .Add('Caption', 'RAD Studio Documentation')
      .Add('URL', 'https://docwiki.embarcadero.com/RADStudio')
      .EndObject
      .EndArray
      .EndObject;
    Result := StringWriter.ToString;
  finally
    Builder.Free;
    Writer.Free;
    StringWriter.Free;
  end;
end;

內容解密:

  1. TStringWriter 和 TJsonTextWriter 的建立:首先,建立 TStringWriterTJsonTextWriter 例項,用於寫入 JSON 資料。
  2. TJSONObjectBuilder 的使用:建立 TJSONObjectBuilder 例項,並將 TJsonTextWriter 傳入建構子。
  3. JSON 結構的建立:使用 TJSONObjectBuilder 的方法建立 JSON 結構,如 .BeginObject.BeginArray.Add 等。
  4. 格式化輸出:設定 TJsonTextWriterFormatting 屬性為 TJsonFormatting.Indented,以美化輸出的 JSON 字串。
  5. 結果取得:將 TStringWriter 的內容轉換為字串並傳回。

讀取 JSON 資料

在處理 JSON 資料時,開發者需要假設特定的資料結構。有兩種主要的方法來讀取 JSON 資料:使用 DOM 解析和串流解析。

使用 DOM 解析 JSON

uses
  System.JSON;

procedure ReadJsonWithDOM(JsonText: string);
var
  JsonValue: TJSONValue;
  JsonObject: TJSONObject;
  JsonArray: TJSONArray;
  I: Integer;
begin
  JsonValue := TJSONObject.ParseJSONValue(JsonText);
  if JsonValue is TJSONObject then
  begin
    JsonObject := JsonValue as TJSONObject;
    JsonArray := JsonObject.GetValue('Favorites') as TJSONArray;
    for I := 0 to JsonArray.Count - 1 do
    begin
      if JsonArray.Items[I] is TJSONObject then
      begin
        // 處理個別的 JSON 物件
      end;
    end;
  end;
  JsonValue.Free;
end;

內容解密:

  1. TJSONObject.ParseJSONValue:解析 JSON 文字並傳回 TJSONValue 參考,指向 JSON 物件的根。
  2. 檢查 JSON 結構:檢查解析後的 JSON 資料是否符合預期的結構。
  3. 處理個別物件:遍歷 JSON 陣列並處理個別的 JSON 物件。

使用 TJsonTextReader 解析 JSON

uses
  System.JSON.Readers;

procedure ReadJsonWithReader(JsonText: string);
var
  StringReader: TStringReader;
  JsonReader: TJsonTextReader;
begin
  StringReader := TStringReader.Create(JsonText);
  JsonReader := TJsonTextReader.Create(StringReader);
  try
    while JsonReader.Read do
    begin
      if JsonReader.TokenType = TJsonToken.StartObject then
      begin
        // 處理 JSON 物件
      end;
    end;
  finally
    JsonReader.Free;
    StringReader.Free;
  end;
end;

內容解密:

  1. TJsonTextReader 的使用:建立 TJsonTextReader 例項,並使用 TStringReader 提供 JSON 文字。
  2. 逐一讀取 JSON Token:使用 TJsonTextReaderRead 方法逐一讀取 JSON Token。
  3. 處理個別物件:當遇到 StartObject Token 時,處理個別的 JSON 物件。

圖表翻譯:

此圖示展示了處理 JSON 資料的基本流程。首先,檢查 JSON 資料的有效性。如果 JSON 結構有效,則進入處理階段;否則,回報錯誤。無論結果如何,最終都會結束處理流程。此圖清晰地說明瞭 JSON 資料處理的條件分支邏輯和不同處理路徑的銜接方式。

處理 XML 資料

儘管 JSON 已成為主流的資料交換格式,XML 仍在許多應用場景中被廣泛使用。Delphi 透過 TXMLDocument 元件支援 XML 處理。

使用 TXMLDocument 處理 XML

uses
  Xml.XMLDoc, Xml.XMLIntf;

procedure ReadXmlFile(FileName: string);
var
  XMLDoc: TXMLDocument;
  RootNode, ChildNode: IXMLNode;
begin
  XMLDoc := TXMLDocument.Create(nil);
  try
    XMLDoc.LoadFromFile(FileName);
    XMLDoc.Active := True;
    RootNode := XMLDoc.DocumentElement;
    for ChildNode in RootNode.ChildNodes do
    begin
      if ChildNode.IsTextElement then Continue;
      // 處理 XML 節點
    end;
  finally
    XMLDoc.Free;
  end;
end;

內容解密:

  1. TXMLDocument 的建立:建立 TXMLDocument 例項並載入 XML 檔案。
  2. 遍歷 XML 節點:取得 XML 檔案的根節點並遍歷其子節點。
  3. 處理 XML 資料:處理個別的 XML 節點。

使用 XML Data Binding Wizard

XML Data Binding Wizard 可以根據 XML Schema 或現有的 XML 檔案生成對應的 Object Pascal 類別,簡化 XML 資料的處理流程。

圖表翻譯:

此圖示展示了 Delphi 中處理 JSON 和 XML 資料的不同方法和工具。JSON 資料處理可以透過 Fluent Builders 和 JSON Data Binding Wizard 實作,而 XML 資料處理則可以透過 TXMLDocument 和 XML Data Binding Wizard 實作。這些工具和方法幫助開發者更高效地處理資料交換和儲存。

Delphi中讀取XML檔案的實作方法

在Delphi中,讀取XML檔案可以透過使用XML資料繫結技術來實作。以下是一個範例,展示如何使用Delphi讀取XML檔案並將其內容顯示在表單上。

XML檔案結構

假設我們的XML檔案結構如下:

<Favorites>
 <Favorite>
 <URL>https://example.com</URL>
 <Caption>範例網站</Caption>
 </Favorite>
 <!-- 其他最愛專案 -->
</Favorites>

讀取XML檔案的Delphi程式碼

procedure TFormFavXML.BtnReadClick(Sender: TObject);
var
 Favs: TFavorites;
 Fav: TFavorite;
 FavsXML: IXMLFavoritesType;
 I: integer;
begin
 Favs := TFavorites.Create;
 try
 FavsXML := LoadFavorites(GetFilename);
 for I := 0 to FavsXML.Count - 1 do
 begin
 Fav := TFavorite.Create;
 Fav.URL := FavsXML[I].URL;
 Fav.Caption := FavsXML[I].Caption;
 Favs.Add(Fav);
 end;

 DisplayFavsCount(Favs);
 finally
 Favs.Free;
 end;
end;

內容解密:

此段程式碼展示瞭如何在Delphi中讀取XML檔案。首先,建立一個TFavorites物件來儲存最愛清單。然後,使用LoadFavorites函式從指定的檔案中載入XML資料至FavsXML介面。接著,透過迴圈遍歷FavsXML中的每個Favorite專案,並為每個專案建立一個TFavorite物件,將其URL和Caption屬性指定後加入到Favs清單中。最後,呼叫DisplayFavsCount函式顯示讀取到的最愛專案數量。

程式碼流程圖

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Delphi JSON XML 資料處理技巧

package "系統架構" {
    package "前端層" {
        component [使用者介面] as ui
        component [API 客戶端] as client
    }

    package "後端層" {
        component [API 服務] as api
        component [業務邏輯] as logic
        component [資料存取] as dao
    }

    package "資料層" {
        database [主資料庫] as db
        database [快取] as cache
    }
}

ui --> client : 使用者操作
client --> api : HTTP 請求
api --> logic : 處理邏輯
logic --> dao : 資料操作
dao --> db : 持久化
dao --> cache : 快取

note right of api
  RESTful API
  或 GraphQL
end note

@enduml

圖表翻譯:

此圖示描述了讀取XML檔案並處理最愛清單的流程。首先,程式開始讀取XML檔案,並建立一個TFavorites物件來儲存資料。接著,載入XML檔案並檢查是否存在最愛專案。如果存在,則建立TFavorite物件並將其加入清單中;如果不存在,則直接結束處理。無論結果如何,最後都會顯示最愛專案的數量。

進一步最佳化

  1. 錯誤處理:在實際應用中,應加入錯誤處理機制,例如檢查XML檔案是否存在、是否能正確解析等。
  2. 效能最佳化:對於大型XML檔案,可以考慮使用流式解析器(如TXmlTextReader)來提高效能。
  3. UI更新:在DisplayFavsCount函式中,可以考慮更新UI元件(如ListView或TreeView)以顯示最愛清單的詳細內容。