Code Monkey home page Code Monkey logo

datasetconverter4delphi's Introduction

DataSet Converter For Delphi

The DataSetConverter4D it is an API to convert JSON objects for DataSet's and also doing reverse process, ie, converting DataSet's in JSON.

Works with the TDataSet, and TJSONObject TJSONArray classes.

To use this API you must add the "DataSetConverter4D\src" Path in your Delphi or on your project.

Convert DataSet to JSON

First you must have your DataSet and its Fields created.

uses 
  DataSetConverter4D, 
  DataSetConverter4D.Impl;    

var
  ja: TJSONArray;
  jo: TJSONObject;
begin
  fCdsCustomers.DataSetField := nil;
  fCdsCustomers.CreateDataSet;

  fCdsCustomers.Append;
  fCdsCustomers.FieldByName('Id').AsInteger := 1;
  fCdsCustomers.FieldByName('Name').AsString := 'Customers 1';
  fCdsCustomers.FieldByName('Birth').AsDateTime := StrToDateTime('22/01/2014 14:05:03');
  fCdsCustomers.Post;

  fCdsCustomers.Append;
  fCdsCustomers.FieldByName('Id').AsInteger := 2;
  fCdsCustomers.FieldByName('Name').AsString := 'Customers 2';
  fCdsCustomers.FieldByName('Birth').AsDateTime := StrToDateTime('22/01/2014 14:05:03');
  fCdsCustomers.Post;

  //Convert all records	
  ja := TConverter.New.DataSet(fCdsCustomers).AsJSONArray;
  
  //Convert current record
  jo := TConverter.New.DataSet.Source(fCdsCustomers).AsJSONObject;

  ja.Free;
  jo.Free;
end;

Convert JSON to DataSet

First you must have your DataSet and its Fields created.

uses 
  DataSetConverter4D, 
  DataSetConverter4D.Impl;  

JSON_ARRAY =
		[{
			"Id": 1,
			"Name": "Customers 1",
			"Birth": "2014-01-22 14:05:03"
		}, {
			"Id": 2,
			"Name": "Customers 2",
			"Birth": "2014-01-22 14:05:03"
		}]      
			  
JSON_OBJECT =
		{
			"Id": 2,
			"Name": "Customers 2",
			"Birth": "2014-01-22 14:05:03"
		}
var
  ja: TJSONArray;
  jo: TJSONObject;
begin
  fCdsCustomers.CreateDataSet;

  ja := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(JSON_ARRAY), 0) as TJSONArray;
  jo := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(JSON_OBJECT), 0) as TJSONObject;

  //Convert one record
  TConverter.New.JSON(jo).ToDataSet(fCdsCustomers);

  fCdsCustomers.EmptyDataSet;

  //Convert all records
  TConverter.New.JSON.Source(ja).ToDataSet(fCdsCustomers);

  ja.Free;
  jo.Free;
end;

Using DataSetConverter4D

Using this library will is very simple, you simply add the Search Path of your IDE or your project the following directories:

  • DataSetConverter4Delphi\src\

Analyze the unit tests they will assist you.

datasetconverter4delphi's People

Contributors

andersondacampo avatar ezequieljuliano avatar hunsche avatar marcosafincotto avatar microsys-sistemas avatar oneideluizschneider avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

datasetconverter4delphi's Issues

LowerCase nos Fields

Dentro da função DataSetToJSONObject quanto eu utilizo, eu coloco key := LowerCase(dataSet.Fields[i].FieldName) afim de manter um "padrão" para o JSON com as keys em letras minúsculas. Você acharia interessante colocar isso no projeto principal?

Campos decimais('invalid class typecast')

Bom dia!
Primeiramente parabéns pelo framework, muito útil. Estou começando a utilizar este framework e me deparei com a seguinte situação:
em numa tabela(Firebird 2.5) eu tenho um campo definido como decimal(5,2). Ao gerar um ClientDataSet para esta tabela eu estou definindo o campo como Float. No momento em que eu executo o seguinte comando 'RESTRequest.Execute' é mostrado a seguinte mensagem de erro: 'invalid class typecast'. Se este campo for alterado para decimal(10,2) ou maior não ocorre o erro.
Tentei fazer algumas alterações mas não obtive sucesso.
O framework está atualizado(29/05/2018).
Tem alguma ideia do que pode ser?
Att.,
Rafael Moroni

Class helper

Olá,
O que acha de modificarmos a classe de helper?
Me refiro, para podermos seguir o padrão da embarcadero, como por exemplo voce pegar uma variável do tipo inteiro, e colocar .ToString e não .AsString...
Posso me encarregar de realizar os ajustes se quiser...

Forma de criar os campos do dataset

Existe alguma forma de criar os campos do dataset direto de um jsonArray ou jsonObject?
Tentei procurar pelo ToStructure mas parece que não existe mais.

Bug: ftFloat and ftCurrency not support System.SysUtils.FormatSettings.DecimalSeparator

Source:
field.AsCurrency := (jv as TJSONNumber).AsDoulbe;
and
field.AsFloat := (jv as TJSONNumber).AsDouble;

ChangeTo:
field.AsCurrency := StrToCurr(jv.Value);
and
field.AsFloat := StrToFloat(jv.Value);

Then support set:
System.SysUtils.FormatSettings.DecimalSeparator


    TFieldType.ftCurrency:
      begin
        if jv is TJSONNull then
          field.Clear
        else

// field.AsCurrency := (jv as TJSONNumber).AsDouble;
field.AsCurrency := StrToCurr(jv.Value);
end;
TFieldType.ftFloat, TFieldType.ftFMTBcd, TFieldType.ftBCD:
begin
if jv is TJSONNull then
field.Clear
else
// field.AsFloat := (jv as TJSONNumber).AsDouble;
field.AsFloat := StrToFloat(jv.Value);
end;

Create Fields from Json

I have a situation where would be interesting to fill an empty dataset with all the fields from the json, for example, before import all json objects from an Array of JsonObjects, I could give the dataset one scheme with the sample data that better represents the expected structure

var sample_data = '{"name": "Some String", "age": 99, "valid_date": "2023-01-01 11:00:00", "valid_number": 999.99 }';
dataset.addFieldFromJson(sample_data);
dataset.fromJsonArray; 

Intended to produce the following dataset

  dataset.FieldDefs.Add('name', ftString, 10, {required = } false);
  dataset.FieldDefs.Add('age', ftInteger, {required = } false);
  dataset.FieldDefs.Add('valid_date', ftDateTime, {required = } false);
  dataset.FieldDefs.Add('valid_number', ftExtended, {required = } false);

Or another most explicit structure whould result in the same dataset

var sample_data = '[
     {"field_name": "name, "field_type": "ftString", "field_size": 10, "field_required": true },
     {"field_name": "age, "field_type": "ftInteger", "field_required": false},
     {"field_name": "valid_date, "field_type": "ftDate", "field_required": true },
     {"field_name": "valid_number, "field_type": "ftExtended", "field_size": 18, "field_precision": 2 , "field_required": false},
 ]';

Timezone

Seria interessante criar um parâmetro incluir ou não a timezone já que a própria função DateToISO8601 permite isso.

No meu caso estou tendo que remover o Z do final da data para poder formatar a mesma no javascript, já que formatando com o Z a hora fica errada.

TFieldType.ftDate, TFieldType.ftTimeStamp, TFieldType.ftDateTime, TFieldType.ftTime:
begin
  Result.AddPair(key, TJSONString.Create(DateToISO8601(dataSet.Fields[i].AsDateTime, FALSE)))
end;

Field do tipo UUID

Estou usando UUID como pk nas tabelas, com banco postgres, ai na hora de converter o dataset para json ocorre uma exceção dizendo que não encontrou um tipo correto para esse campo. Obs, não estou criando os fields na query, apenas fazendo o open no sql. Existe alguma solução que não seja criar todos os campos no dataset?

Omitir Campos

Na conversão de DataSet para Json existe alguma maneira de omitir alguns campos?
Ao gerar json para enviar para inclusão ou alteração as vezes não queremos incluir campos de data/hora ou o campo de id no caso de novo cadastro.

Desde já obrigado.

ftByte is not handled

Hello,

I have an SQL Server table with tinyint column. That column translates as ftByte.

ftByte raises an exception "Cannot find type for field..."

I have added ftByte among ftInteger group. Writing in here just to let you know about issue.

Thanks.

--Ertan

Problemas Conversao de Data no SQLSERVER

Ezequiel
Existe um problema na conversão do DataSet.AsJSONArray, para campos datetime no SQLSERVER

Este campos no firedac são do tipo TSQLTimeStampField e na conversao do da rotina DataSetConvert4D.imp , estes campos ficam sem a parte da DATA, acredito que o tipo deva estar na opção de TFieldType.ftDateTime também.

TFieldType.ftTimeStamp, TFieldType.ftTime:
begin
if not dataSet.Fields[i].IsNull then
begin
timeStamp := dataSet.Fields[i].AsSQLTimeStamp;
Result.AddPair(key, TJSONString.Create(SQLTimeStampToStr('hh:nn:ss', timeStamp)));
end
else
Result.AddPair(key, TJSONNull.Create);

TDataSetConverter.DataSetToJSONArray

Acredito que essa função deve ter um "DataSet.DisableControls" antes de iniciar o loop e consequentemente um "DataSet.EnableControls" ao final do processo. Ou colocar como opção.

Enviar vários DataSets num único JsonArray

Bom dia!
Eu estou utilizando este framework para enviar as NFes de um sistema mobile para um servidor e está funcionando normalmente. O grande problema é que eu estou enviando primeiramente o cabeçalho da NFe, depois os seus produtos, as parcelas da NFe e finalmente o cliente. É que da forma que estou enviando eu estou perdendo a atomicidade do banco de dados, ou seja, se caso ocorrer um problema num dos envios eu fico com parte da NFe gravada e outra não.
Gostaria de saber se existe alguma forma de eu enviar/receber todos os dados em apenas um JSONArray utilizando este framework?

Master/Detail?

Obrigado,
Rafael Moroni

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.