Как вы можете создать JSON вручную, используя Delphi с библиотекой Mormot?

Я хотел бы сгенерировать JSON для представления сложного объекта вручную (без RTTI и т. д.).

Можно ли это сделать с помощью Mormot (и как)?

Я нашел тип JSON Variant, но он, похоже, не способен создавать сложный JSON, подобный приведенному здесь: Создать массив JSON с помощью LKJSON в Delphi 7

Конечно, я мог бы использовать lkJSON, но, поскольку мой проект уже использует Mormot, я бы предпочел использовать уже используемую библиотеку.


person RM.    schedule 09.10.2017    source источник
comment
Вам не нужно использовать mormot для этого, Delphi поставляется с библиотекой JSON.   -  person David Heffernan    schedule 09.10.2017
comment
Я надеялся, что если Mormot будет поддерживать это, то он будет эффективнее и быстрее, чем DBXJSON.   -  person RM.    schedule 09.10.2017
comment
@DavidHeffernan Я не верю, что библиотека JSON поставляется с SKU PRO (за исключением случаев, когда вы добавляете опцию FireDAC/база данных за 500 долларов).   -  person alcalde    schedule 09.10.2017
comment
@alcalde нет, в профессиональной версии есть библиотека json   -  person David Heffernan    schedule 09.10.2017
comment
Я создал это специально, чтобы иметь хорошую краткую нотацию для создания объектов JSON с синтаксисом Delphi. Хотя он во многом основан на Variant...   -  person Stijn Sanders    schedule 10.10.2017


Ответы (1)


В mORMot есть несколько способов создать любой документ json.

Ниже вы можете найти один из них, сериализующий приведенный вами пример, ИМХО, более читаемый и понятный:

...
uses SynCommons;
...
var parcelas , venda , vendas , json : variant;
begin
  parcelas := _Obj(['numero',1,
                    'valor',50
                   ]);
  venda    := _Obj(['nsuOrigem','1',
                    'data','2014-03-14',
                    'nrParcelas',1,
                    'valor',50,
                    'parcelas' , _Arr([parcelas
                                      ])
                   ]);
  vendas := _Arr([venda]);
  venda := _Obj(['nsuOrigem','2',
                 'data','2014-03-14',
                 'nrParcelas',1,
                 'valor',50,
                 'parcelas' , _Arr([parcelas  //in this case this object is the same
                                   ])
                ]);
  TDocVariantData(vendas).AddItem(venda);
  json := _Obj(['nrVendas',2,
                'totalVendas',100.0,
                'vendas',vendas
               ]);
  //
  assert(json.nrVendas=2);
  assert(json.vendas._count=2);
  assert(json.vendas._(0).nsuOrigem='1');
  assert(json.vendas._(1).nsuOrigem='2');
  assert(json.vendas._(1).parcelas._(0).valor=50);
end;

Это должно работать от Delphi 7 до 10.4. Дополнительные сведения см. в замечательной документации.

person Xalo    schedule 08.01.2021