JSON and XML

41.1 System.JSON (DOM)

uses System.JSON;

// Build
var Obj := TJSONObject.Create;
try
  Obj.AddPair('name', 'Ana');
  Obj.AddPair('age', TJSONNumber.Create(30));
  Obj.AddPair('active', TJSONBool.Create(True));
  var Tags := TJSONArray.Create;
  Tags.Add('admin'); Tags.Add('editor');
  Obj.AddPair('tags', Tags);
  Writeln(Obj.ToJSON);          // compact
  Writeln(Obj.Format(2));       // pretty (10.3+)
finally
  Obj.Free;                     // frees the child values too
end;

// Parse
var Parsed := TJSONObject.ParseJSONValue('{"user":{"name":"Bo","scores":[90,85]}}') as TJSONObject;
try
  Writeln(Parsed.GetValue<string>('user.name'));               // path access
  var Scores := Parsed.GetValue<TJSONArray>('user.scores');
  for var Item in Scores do Writeln(Item.Value);
  var Missing: string;
  if not Parsed.TryGetValue<string>('user.email', Missing) then Writeln('no email');
finally
  Parsed.Free;
end;

41.2 Object ↔ JSON Serialization

Readers/writers: System.JSON.Readers, System.JSON.Writers, System.JSON.Builders (TJSONObjectBuilder, fluent and streaming).

Third-party: mORMot (very fast JSON), Neon (serialization library), SuperObject, JsonDataObjects (fast, popular), Grijjy (BSON/JSON).

uses REST.Json, REST.Json.Types;

type
  TCustomer = class
  private
    [JSONName('customer_name')] FName: string;
    FAge: Integer;
    [JSONMarshalled(False)] FInternalId: Integer;      // excluded
  public
    property Name: string read FName write FName;
    property Age: Integer read FAge write FAge;
  end;

var C := TCustomer.Create;
C.Name := 'Ana'; C.Age := 30;
var Json := TJson.ObjectToJsonString(C, [joIgnoreEmptyStrings]);
var C2 := TJson.JsonToObject<TCustomer>(Json);
// Newer: System.JSON.Serializers TJsonSerializer (supports records/generics, Newtonsoft-style attributes)

41.3 XML

The XML Data Binding Wizard generates typed interfaces from XSD/XML. DOM vendors: MSXML (Windows), ADOM (cross-platform), OmniXML. Also SAX parsing and XSLT (TXSLPageProducer).

Other formats: CSV (TFDBatchMove with a text reader, or TStringList with delimiters), YAML (third-party), Protocol Buffers (Grijjy, protobuf-delphi), MessagePack.

uses Xml.XMLDoc, Xml.XMLIntf;
var Doc: IXMLDocument := TXMLDocument.Create(nil);
Doc.Active := True;
Doc.Version := '1.0'; Doc.Encoding := 'UTF-8';
var Root := Doc.AddChild('customers');
var Cust := Root.AddChild('customer');
Cust.Attributes['id'] := 1;
Cust.AddChild('name').Text := 'Ana';
Doc.SaveToFile('customers.xml');

var Loaded := LoadXMLDocument('customers.xml');
for var I := 0 to Loaded.DocumentElement.ChildNodes.Count - 1 do
begin
  var Node := Loaded.DocumentElement.ChildNodes[I];
  Writeln(Node.Attributes['id'], ': ', Node.ChildNodes['name'].Text);
end;