You are not logged in.
Pages: 1
Hi,
I have below record definitions.
TStTicket = packed record
TransactionFlags: UInt32;
OptionFlags: UInt32;
ZNo: UInt16;
FNo: UInt16;
EJNo: UInt16;
TotalReceiptAmount: UInt32;
TotalReceiptTax: UInt32;
TotalReceiptDiscount: UInt32;
TotalReceiptIncrement: UInt32;
CashBackAmount: UInt32;
TotalReceiptItemCancel: UInt32;
TotalReceiptPayment: UInt32;
TotalReceiptReversedPayment: UInt32;
KasaAvansAmount: UInt32;
KasaPaymentAmount: UInt32;
invoiceAmount: UInt32;
invoiceAmountCurrency: UInt32;
KatkiPayiAmount: UInt32;
TaxFreeRefund: UInt32;
TaxFreeCalculated: UInt32;
bcdTicketDate: string;
bcdTicketTime: string;
ticketType: Byte;
totalNumberOfItems: UInt16;
numberOfItemsInThis: UInt16;
totalNumberOfPayments: UInt16;
numberOfPaymentsInThis: UInt16;
TckNo: string;
invoiceNo: string;
invoiceDate: UInt32;
invoiceType: Byte;
totalNumberOfPrinterLines: Integer;
numberOfPrinterLinesInThis: Integer;
uniqueId: Array [0..23] of Byte;
SaleInfo: Array [0..511] of TStSaleinfo;
stPayment: TStPayment;
stTaxDetails: Array [0..7] of TStVATDetail;
stPrinterCopy: Array [0..1023] of TStPrinterDataForOneLine;
end;
TStSaleinfo = packed record
ItemType: Byte;
ItemPrice: UInt64;
IncAmount: UInt64;
DecAmount: UInt64;
OrigialItemAmount: UInt32;
OriginalItemAmountCurrency: UInt16;
ItemVatRate: UInt16;
ItemCurrencyType: UInt16;
ItemVatIndex: Byte;
ItemCountPrecision: Byte;
ItemCount: Integer;
ItemUnitType: Byte;
DeptIndex: Byte;
Flag: UInt32;
Name: string;
Barcode: string;
end;
TStPayment = packed record
flags: Byte;
dateOfPayment: UInt32;
typeOfPayment: UInt32; // EPaymentTypes
subtypeOfPayment: Byte; // EPaymentSubtypes
orgAmount: UInt32; // Exp; Currency Amount
orgAmountCurrencyCode: UInt16; // as defined in currecyTable from GIB
payAmount: UInt32;
payAmountCurrencyCode: UInt16;
cashBackAmountInTL: UInt32; // currency with precision 2
cashBackAmountInDoviz: UInt32; // if currency sale, then curency amount
stBankPayment: TStBankPaymentInfo; // Keeps all payment info related with bank
end;
TStBankPaymentInfo = packed record
batchNo: UInt32;
stan: UInt32;
balance: UInt32;
bankBkmId: UInt16;
numberOfdiscount: Byte;
numberOfbonus: Byte;
authorizeCode: string;
transFlag: Array [0..1] of Byte;
terminalId: string;
rrn: string;
merchantId: string;
bankName: string;
numberOfInstallments: Byte;
numberOfsubPayment: Byte;
numberOferrorMessage: Byte;
stBankSubPaymentInfo: Array [0..11] of TStBankSubPaymentInfo;
stCard: TStCardInfo;
stPaymentErrMessage: TStPaymentErrMessage;
end;
TStBankSubPaymentInfo = packed record
My_type: UInt16; // EPaymentSubType
amount: UInt32;
name: string;
end;
TStCardInfo = packed record
inputType: Byte;
pan: string;
holderName: string;
My_type: string;
expireDate: string;
end;
TStPaymentErrMessage = packed record
ErrorCode: string; // bank error code
ErrorMsg: string;
AppErrorCode: string; // payment application specific error code
AppErrorMsg: string;
end;
TStVATDetail = packed record
u32VAT: Integer; //**< Total Tax in TL with precition 2 */
u32Amount: Integer; //**< Total Amount in TL with precition 2 */
u16VATPercentage: UInt16; //**< Tax rate, it is 1800 for %18 */
end;
TStPrinterDataForOneLine = packed record
Flag: UInt32;
lineLen: Byte;
line: string;
end;
I am using below code to serialize this records into json:
var
StTicket: TStTicket;
JsonString: RawUTF8;
begin
JsonString := RecordSaveJSON(StTicket, TypeInfo(TStTicket));
end;
I have quite a long json string. It's all fine but serialization of "StTaxDetails" defined in TStTicket. What I am having as a serialized json is something like below (beginning and end is cut for making it more readable):
.....":""}}},"stTaxDetails":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","stPrinterCopy":[{".....
What I was expecting is something like:
.....":""}}},"stTaxDetails":[{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0},{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0},{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0},{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0},{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0},{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0},{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0},{"u32VAT":0,"u32Amount":0,"u16VATPercentage":0}],"stPrinterCopy":[{".....
I am simply stuck at this point. Is it me doing some wrong record declaration(s) here?
Any help is appreciated.
Thanks.
Offline
May be this can help:
http://stackoverflow.com/questions/3474 … tic-arrays
Offline
RTTI will be generated only if a record contains a "managed type" like dynamic arrays, strings or interfaces.
For that record:
TStVATDetail = packed record
u32VAT: Integer;
u32Amount: Integer;
u16VATPercentage: UInt16;
end;
compiler will not create RTTI info.
But if you use code like this:
type
TStVATDetails = array[0..7] of TStVATDetail;
then RTTI will be generated.
Offline
@Chaa
AFAIR since Delphi 2010, there is extended RTTI information for all records, including the one without any managed type within.
In all cases, the safest is to define the record layout using text, so that it would be compatible with all versions of Delphi compiler, and also with FPC.
See http://synopse.info/files/html/Synopse% … ml#TITL_51
Offline
Sorry, I couldn't be on the Internet before.
I am using Delphi 10.
Is there an option to "extend" rtti for Delphi 10? I do not have deep knowledge about rtti, and do not know if there is such an option/parameter etc.
This json, for me, needs to be generated as Integer type like
"u32VAT":0
and if I am to define these record as string variables, I believe json generated will be like
"u32VAT":"0"
As I am exchanging information with another software, this will be a problem for me. I already used "TTextWriter.RegisterCustomJSONSerializerFromText()" function in my application. However, it was a direct use. I mean, record variable was defined in my record itself. My TStTicket record has sub records in it. What I need to "tweak" is one of these sub types. I am not sure if I can still use that function (before and after exchanging json string) and make it work for my specific case.
Lastly, for me to have a better understanding, I have other UInt16 record variables used at the beginning ot TStTicket record
TStTicket = packed record
TransactionFlags: UInt32;
OptionFlags: UInt32;
ZNo: UInt16;
FNo: UInt16;
EJNo: UInt16;
These seems to be fine when json serialized. Is it Integer type that is causing a problem for me?
Thanks.
Offline
i had this problem with Delphi 2010, too.
The rtti was missing for some records in an interface-based service.
Adding a dummy field of type string did the job.
Offline
@sevo, how did you add a dummy string field and *not* have it serialized in the final json string?
Offline
Afaik this is not automagically possible.
In my case, client and server had to ignore the dummy fields.
Offline
In such cases, you may use a TPersistent/TSynPersistent or even a TSynAutoCreateField class definition (the later will have the ability to manage the livetime of nested objects, and even list of objects - serialized as JSON arrays - using T*ObjArray definitions).
See http://synopse.info/files/html/Synopse% … #TITLE_580
Offline
Pages: 1