TDBXJsonTools copiar/converter dados entre TDataSet – TJSONObject – DBXReader
Você pode copiar os dados de um DBXReader para um ClientDataSet e vice-versa utilizando o dbxExpress framework, provavelmente você já leu alguns dos meus artigos aqui no blog onde explico como isso funciona em aplicações desktop, entretanto em plataformas móveis não temos o ClientDataSet e quando buscamos algo similar vem a pergunta, o que fazer?
DataSnap Mobile Connectors tem um classe chamada TDBXJsonTools que permite a copia e conversão de dados entre DBXReader, TJSONObject, DBXReader e outros tipos de dados, pode ser utilizada em qualquer plataforma suportada pelos conectores, como: Java/Android, Java/BlackBerry, Objective-C, C#/Windows Phone e FreePascal.
Em aplicações desktop nativa utilizamos o TDBXDataSetReader.CopyReaderToClientDataSet(Reader, ClientDataSet) para copiar os dados do DBXReader para um ClientDataSet, no caso de aplicações móveis usamos TDBXJsonTools.CreateTDataSetFromJSON(DBXReader.asJSONObject).
Entretanto não estamos limitados a copia/conversão de dados, TDBXJsonTools traz maior flexibilidade na interação e transporte dos dados usando diferentes tipos de dados, além de usar o melhor dos tipos nativos em cada plataforma. Por exemplo, quando utilizamos DataSet em aplicações FireMonkey para iOS utilizamos a classe TDataSet que é parte da RTL do Delphi e FreePascal, já no caso de aplicações Java, TDataSet será uma extensão do TDBXReader e assim por diante.
DBXReader é unidirecional e com isso a navegação fica limitada, no entanto ao desenvolver aplicações FireMonkey para iOS você poderá copiar os dados do DBXReader para um DataSet que é bidirecional, isso irá permitir a navegação no DataSet e utilizar outros métodos do DataSet.
Abaixo a interface da classe TDBXJsonTools para FreePascal.
TDBXJsonTools = class public class procedure jsonToDBX(obj: TJSONValue; var value: TDBXValue; dbxTypeName: String); class procedure JSONToValueType(json: TJSONArray; var vt: TDBXValueType); class function DBXParametersToJSONObject(dbxParameters: TDSParams) : TJSONObject; class function DBXReaderToJSONObject(dbxReader: TDBXReader): TJSONObject; class function CreateTDataSetFromJSON(value: TJSONObject): TDataset; class function TDataSetToJSONObject(value: TDataset): TJSONObject; class function GetTFieldTypeByTDBXDataTypes(DBXDataTypes: TDBXDataTypes) : TFieldType; class function GetTDBXDataTypesByTFieldType(FieldType: TFieldType) : TDBXDataTypes; class function CreateTStreamFromJSONArray(value: TJSONArray): TStream; class function StreamToJSONArray(value: TStream): TJSONArray; class function JSONToTableType(value: TJSONValue; dbxTypeName: String): TObject; class function SerializeTableType(Objetc: TObject): TJSONObject; end;
Eu continuo recomendando o uso do DBXReader como sua fonte principal de dados e quando necessário utilize os métodos da classe TDBXJsonTools.
Ola andreano, estou fazendo uma aplicação client-servidor com datasnap e me surgiu uma duvida, assim como é possivel criar uma CustomConverter par transformar Classes especificas para Json, é possivel registrar uma do lado do servidor que seja transparente para que eu possa continuar trafegando os meus objetos ao inves de TJSonObjects?