Jump to content

boris.nihil

Members
  • Content Count

    18
  • Joined

  • Last visited

Community Reputation

0 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. boris.nihil

    Parse Json

    all thanks goes to Remy
  2. boris.nihil

    Parse Json

    function GetValue(JsonObject: TJSONObject; const PairName: string): TJSONValue; var JsonPair: TJSONPair; begin JsonPair := JsonObject.Get(PairName); if JsonPair = nil then raise Exception.Create('Pair "' + PairName + '" not found'); Result := JsonPair.JsonValue; end; function GetObject(JsonObject: TJSONObject; const PairName: string): TJSONObject; begin Result := GetValue(JsonObject, PairName) as TJSONObject; end;
  3. boris.nihil

    Parse Json

    var JsonValueArr,JsonValue: TJSONValue; JsonObject: TJSONObject; jasonArr: TJSONArray; begin JsonValue := TJSONObject.ParseJSONValue(memoRequest.Lines.Text); if JsonValue = nil then begin ShowMessage('Error'); end else begin JsonObject := JsonValue as TJSONObject; JsonObject := GetObject(JsonObject, 'forretningsadresse'); jasonArr := GetValue(JsonObject, 'adresse') as TJSONArray; for JsonValueArr in jasonArr do begin showmessage(JsonValueArr.Value); end; end; end;
  4. boris.nihil

    New to JSON

    you are right, thanks for you help and your time
  5. boris.nihil

    New to JSON

    this works ok.. var jasonArr:TJSONArray; par: TJSONPair; i: Integer; LItem:TJSONValue; JsonValueArr : TJSONValue; testValue: TJSONValue; begin jasonArr := GetValue(JsonObject, 'documentStatus') as TJSONArray; for JsonValueArr in jasonArr do begin for LItem in TJSONArray(JsonValueArr) do begin if TJSONPair(LItem).JsonString.Value = 'statusCode' then odgovorFinaStatus.b2gStatus := TJSONPair(LItem).JsonValue.Value else if TJSONPair(LItem).JsonString.Value = 'statusText' then odgovorFinaStatus.b2gStatusTekst := TJSONPair(LItem).JsonValue.Value else if TJSONPair(LItem).JsonString.Value = 'statusTimestamp' then odgovorFinaStatus.b2gStatusVrijeme := TJSONPair(LItem).JsonValue.Value else if TJSONPair(LItem).JsonString.Value = 'note' then odgovorFinaStatus.b2gStatusNapomena := TJSONPair(LItem).JsonValue.Value else if TJSONPair(LItem).JsonString.Value = 'partialAmount' then begin try odgovorFinaStatus.b2gDjelIzn := StrToFloat(TJSONPair(LItem).JsonValue.Value); except odgovorFinaStatus.b2gDjelIzn := 0 end; end;
  6. boris.nihil

    New to JSON

    when i write for LItem in TJSONObject(JsonValueArr) do it says: [dcc32 Error] Unit1.pas(568): E2010 Incompatible types: 'TJSONValue' and 'TJSONPair'
  7. boris.nihil

    New to JSON

    something like this, seems to work: jasonArr := GetValue(JsonObject, 'documentStatus') as TJSONArray; for JsonValueArr in jasonArr do begin for LItem in TJSONArray(JsonValueArr) do begin ShowMessage(TJSONPair(LItem).JsonString.Value + '/' + TJSONPair(LItem).JsonValue.Value); end; end;
  8. boris.nihil

    New to JSON

    it works fine,thanks but now i have some array inside object how to acces this documentStatus element ? { "messageAck": { "messageID": "Middleware_002", "messageAckID": "a98d281b-9608-4b25-be03-7be0403916dd", "messageType": 9012, "ackStatus": "ACCEPTED", "ackStatusCode": 10, "ackStatusText": "Message received!" }, "b2GOutgoingInvoiceStatus": { "supplierID": "9934:86167814130", "additionalSupplierID": null, "invoiceID": 83703, "supplierInvoiceID": "IR-19-1766-1-1", "invoiceTimestamp": "28-02-2020", "documentStatus": [ { "statusCode": "RECEIVED", "statusText": "Received", "statusTimestamp": "28-02-2020", "note": null, "partialAmount": null} ] } }
  9. boris.nihil

    New to JSON

    uh, it's very complicated.. Thank a lot on your effort
  10. boris.nihil

    New to JSON

    you are right, from small to big picture i think this will do: JSonObject := TJSonObject.Create; JsonValue := JSonObject.ParseJSONValue(memoRequest.Lines.Text); JsonValue := (JsonValue as TJSONObject).Get('b2GOutgoingInvoiceEnvelope').JSONValue; JsonValue := (JsonValue as TJSONObject).Get('b2GOutgoingInvoiceProcessing').JSONValue; JsonValue := (JsonValue as TJSONObject).Get('correctB2GOutgoingInvoice').JSONValue; JsonValue := (JsonValue as TJSONObject).Get('invoiceID').JSONValue;
  11. boris.nihil

    New to JSON

    i can't figure out how to parse json answer from some invoice company I use Delphi XE4, DBXJSON... How to get Jsonpairs insde nested objects... Example: { "messageAck": { "messageID": "Middleware_002", "messageAckID": "8f50dd66-a77f-45ec-9049-0faadb69ff43", "messageType": 9002, "ackStatus": "ACCEPTED", "ackStatusCode": 10, "ackStatusText": "Poruka zaprimljena!" }, "b2GOutgoingInvoiceEnvelope": { "b2GOutgoingInvoiceProcessing": { "correctB2GOutgoingInvoice": {"supplierInvoiceID": "dokument1","invoiceID": 84001,"invoiceTimestamp": "03-03-2020"}, "incorrectB2GOutgoingInvoice": null}} }
  12. boris.nihil

    Comunicate with POS terminal (Ingenico)

    ok..thanks a lot for all the help!
  13. boris.nihil

    Comunicate with POS terminal (Ingenico)

    Thank a lot for a time you spend for this.. Solution 2 with timer works on some way...it's hard to work since i can't play with this device so i need to improvise.. Problem is that timer must work all the time until transaction is complete.. After i received message 'INSERT CARD' timer stops and i can't read anymore. Could you help me how to send some message from server I made with IdTCPServer1 component to Client program with some Button on server form ? Something like "AContext.Connection.IOHandler.Write"...
  14. boris.nihil

    Comunicate with POS terminal (Ingenico)

    i tryed IdTCPClient1.IOHandler.InputBuffer.Clear; IdTCPClient1.IOHandler.Write(s + chr(strtoint(lrc)), IndyTextEncoding_8bit); and then i activate timer: if IdTCPClient1.IOHandler.InputBufferIsEmpty then begin if IdTCPClient1.IOHandler.CheckForDataOnSource(500) then begin receivedtext1 := IdTCPClient1.IOHandler.WaitFor(#6,true,true,IndyTextEncoding_8bit); memo1.SelStart := memo1.GetTextLen; memo1.SelLength := 0; memo1.SelText := 'Received ACK:' + receivedtext1 + #13#10; sleep(500); receivedtext := IdTCPClient1.IOHandler.WaitFor(#3,true,true,IndyTextEncoding_8bit); memo1.SelStart := memo1.GetTextLen; memo1.SelLength := 0; memo1.SelText := 'Received message:' + receivedtext + #13#10; end;
  15. boris.nihil

    Comunicate with POS terminal (Ingenico)

    >> Though I suspect the POS is actually expecting binary data for the message content, not hex-encoded strings, so try something more like this: >> s := #2#2'000000000001000'#28'1000'#28#28'+0'#28'191'#28#28#28#28#28#28#28#28#28#28#28'00'#28'1'#12#28#28#28#28#28#28#28#28#3','; >> IdTCPClient1.IOHandler.Write(s, IndyTextEncoding_8bit); you were right, this works ! But now program hangs for a while waiting for some response or something.. How to receive ACK from POS terminal and other data from POS ? I need to send ACK after every returned answer from POS.. ECR-->POS: <STX><STX>303030303030303030303031303030<FS>31303030<FS><FS>2B30<FS>313931<FS><FS><FS><FS><FS><FS><FS><FS><FS><FS><FS>3030<FS>31<FF><FS><FS><FS><FS><FS><FS><FS><FS><ETX>2C POS-->ECR: <ACK> POS-->ECR: <STX>32303030303030305542414349204B415254494355<ETX>2E (insert CARD) ECR-->POS: <ACK> POS-->ECR: <STX>(CARD in process) ECR-->POS: <ACK> POS-->ECR: <STX>(wait) ECR-->POS: <ACK> POS-->ECR: <STX(aproved) ECR-->POS: <ACK> Maybe this code is not good ? answer := IdTCPClient1.IOHandler.ReadLn(); showmessage(answer ); Here is Protocol what POS terminal use..
×