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;