JSON Parsing Question.

Just starting out? Need help? Post your questions and find answers here.
swhite
Addict
Addict
Posts: 805
Joined: Thu May 21, 2009 6:56 pm

JSON Parsing Question.

Post by swhite »

Hi

I am using the following code to convert the JSON to a Map. The only problem is that PYMT and OPRD values in the Map are empty. So I want to know how I can get the arrays loaded into the Map. I am expecting something like:

lmRcvd3("PYMT")=[{"CT":"CA","A1":"20","round_amount":"-0.01"}]

then I could parse these elements into another Map.

Code: Select all

lcTxt = {"VER#":"3.0","SITE":"KARDTECHLAB","DATE":"20250218043514","BITM":"49","AUID":"051515115643","TRN#":"234567","RQID":"A67G45900T34","CRD1":"705678000000045678","PRD1":"200","PMP#":"04","HOSE":"1","QTYN":"304.567","AMNT":"378.89","PYMT":[{"CT":"CA","A1":"20","round_amount":"-0.01"}],"OPRD":[{"SP":"Crystal","itemcode_conexxus":"","F1":"095","FN":"ETHANOL on Pump 05","A1":"20.01","Q1":"12.59","subTotalDiscounts":"0","originalPPU":"1.589","PR":"1.589","D2":"-0.000","AI":"250219134747","RI":"347475408105","DT":"20250219134747","PN":"05","H1":"","NO":"54081","TV":"","PM":""},{"Q1":"-1.0000000000002","PR":"0.01","A1":"-0.010000000000002","F1":"998","FN":"Cash Rounding","AI":"000000000000","RI":"000000158232","DT":"20250219134849"}]}{"VER#":"3.0","SITE":"KARDTECHLAB","DATE":"20250218043514","BITM":"49","AUID":"051515115643","TRN#":"234567","RQID":"A67G45900T34","CRD1":"705678000000045678","PRD1":"200","PMP#":"04","HOSE":"1","QTYN":"304.567","AMNT":"378.89","PYMT":[{"CT":"CA","A1":"20","round_amount":"-0.01"}],"OPRD":[{"SP":"Crystal","itemcode_conexxus":"","F1":"095","FN":"ETHANOL on Pump 05","A1":"20.01","Q1":"12.59","subTotalDiscounts":"0","originalPPU":"1.589","PR":"1.589","D2":"-0.000","AI":"250219134747","RI":"347475408105","DT":"20250219134747","PN":"05","H1":"","NO":"54081","TV":"","PM":""},{"Q1":"-1.0000000000002","PR":"0.01","A1":"-0.010000000000002","F1":"998","FN":"Cash Rounding","AI":"000000000000","RI":"000000158232","DT":"20250219134849"}]}

NewMap lmRcvd3.s()
ParseJson(0,lcTxt)
ExtractJSONMap(JSONValue(0),lmRcvd3())

Simon White
dCipher Computing
infratec
Always Here
Always Here
Posts: 7662
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: JSON Parsing Question.

Post by infratec »

Code: Select all

Structure PMYT_Structure
  round_amount.s
  CT.s
  A1.s
EndStructure


Structure OPRD_Structure
  subTotalDiscounts.s
  temcode_conexxus.s
  originalPPU.s
  TV.s
  SP.s
  RI.s
  Q1.s
  PR.s
  PN.s
  PM.s
  NO.s
  H1.s
  FN.s
  F1.s
  DT.s
  D2.s
  AI.s
  A1.s
EndStructure


Structure lc_Structure
  VER_.s
  TRN_.s
  SITE.s
  RQID.s
  QTYN.s
  List PYMT.PMYT_Structure()
  PRD1.s
  PMP_.s
  List OPRD.OPRD_Structure()
  HOSE.s
  DATE.s
  CRD1.s
  BITM.s
  AUID.s
  AMNT.s
EndStructure


Define lcTxt$, JSON.i, lmRcvd3.lc_Structure

NewMap lmRcvd3.lc_Structure()

lcTxt$ = ~"{\"VER#\":\"3.0\",\"SITE\":\"KARDTECHLAB\",\"DATE\":\"20250218043514\",\"BITM\":\"49\",\"AUID\":\"051515115643\",\"TRN#\":\"234567\",\"RQID\":\"A67G45900T34\",\"CRD1\":\"705678000000045678\",\"PRD1\":\"200\",\"PMP#\":\"04\",\"HOSE\":\"1\",\"QTYN\":\"304.567\",\"AMNT\":\"378.89\",\"PYMT\":[{\"CT\":\"CA\",\"A1\":\"20\",\"round_amount\":\"-0.01\"}],\"OPRD\":[{\"SP\":\"Crystal\",\"itemcode_conexxus\":\"\",\"F1\":\"095\",\"FN\":\"ETHANOL on Pump 05\",\"A1\":\"20.01\",\"Q1\":\"12.59\",\"subTotalDiscounts\":\"0\",\"originalPPU\":\"1.589\",\"PR\":\"1.589\",\"D2\":\"-0.000\",\"AI\":\"250219134747\",\"RI\":\"347475408105\",\"DT\":\"20250219134747\",\"PN\":\"05\",\"H1\":\"\",\"NO\":\"54081\",\"TV\":\"\",\"PM\":\"\"},{\"Q1\":\"-1.0000000000002\",\"PR\":\"0.01\",\"A1\":\"-0.010000000000002\",\"F1\":\"998\",\"FN\":\"Cash Rounding\",\"AI\":\"000000000000\",\"RI\":\"000000158232\",\"DT\":\"20250219134849\"}]}"

Debug lcTxt$

lcTxt$ = ReplaceString(lcTxt$, "#" , "_")

;Debug lcTxt$

JSON = ParseJSON(#PB_Any, lcTxt$, #PB_JSON_NoCase)
If JSON
  ;Debug ComposeJSON(JSON, #PB_JSON_PrettyPrint)
  
  ExtractJSONStructure(JSONValue(JSON), @lmRcvd3, lc_Structure)
  FreeJSON(JSON)
  
  ForEach lmRcvd3\PYMT()
    Debug "PYMT: " + lmRcvd3\PYMT()\round_amount
  Next
  JSON = CreateJSON(#PB_Any)
  If JSON
    InsertJSONList(JSONValue(JSON), lmRcvd3\PYMT())
    Debug ComposeJSON(JSON);, #PB_JSON_PrettyPrint)
    FreeJSON(JSON)
  EndIf
  
  
  
  ForEach lmRcvd3\OPRD()
    Debug "OPRD: " + lmRcvd3\OPRD()\FN
  Next
  JSON = CreateJSON(#PB_Any)
  If JSON
    InsertJSONList(JSONValue(JSON), lmRcvd3\OPRD())
    Debug ComposeJSON(JSON);, #PB_JSON_PrettyPrint)
    FreeJSON(JSON)
  EndIf
  
Else
  Debug JSONErrorMessage()
  Debug JSONErrorPosition()
EndIf
infratec
Always Here
Always Here
Posts: 7662
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: JSON Parsing Question.

Post by infratec »

Added code to get your wanted list string.
swhite
Addict
Addict
Posts: 805
Joined: Thu May 21, 2009 6:56 pm

Re: JSON Parsing Question.

Post by swhite »

Hi

This is what I came up with for use with a Map. If I run it for 10,000 iterations it takes about 230 milli-seconds.

Code: Select all

Define lcTxt.s = ~"{\"VER#\":\"3.0\",\"SITE\":\"KARDTECHLAB\",\"DATE\":\"20250218043514\",\"BITM\":\"49\",\"AUID\":\"051515115643\",\"TRN#\":\"234567\",\"RQID\":\"A67G45900T34\",\"CRD1\":\"705678000000045678\",\"PRD1\":\"200\",\"PMP#\":\"04\",\"HOSE\":\"1\",\"QTYN\":\"304.567\",\"AMNT\":\"378.89\",\"PYMT\":[{\"CT\":\"CA\",\"A1\":\"20\",\"round_amount\":\"-0.01\"}],\"OPRD\":[{\"SP\":\"Crystal\",\"itemcode_conexxus\":\"\",\"F1\":\"095\",\"FN\":\"ETHANOL on Pump 05\",\"A1\":\"20.01\",\"Q1\":\"12.59\",\"subTotalDiscounts\":\"0\",\"originalPPU\":\"1.589\",\"PR\":\"1.589\",\"D2\":\"-0.000\",\"AI\":\"250219134747\",\"RI\":\"347475408105\",\"DT\":\"20250219134747\",\"PN\":\"05\",\"H1\":\"\",\"NO\":\"54081\",\"TV\":\"\",\"PM\":\"\"},{\"Q1\":\"-1.0000000000002\",\"PR\":\"0.01\",\"A1\":\"-0.010000000000002\",\"F1\":\"998\",\"FN\":\"Cash Rounding\",\"AI\":\"000000000000\",\"RI\":\"000000158232\",\"DT\":\"20250219134849\"}]}{\"VER#\":\"3.0\",\"SITE\":\"KARDTECHLAB\",\"DATE\":\"20250218043514\",\"BITM\":\"49\",\"AUID\":\"051515115643\",\"TRN#\":\"234567\",\"RQID\":\"A67G45900T34\",\"CRD1\":\"705678000000045678\",\"PRD1\":\"200\",\"PMP#\":\"04\",\"HOSE\":\"1\",\"QTYN\":\"304.567\",\"AMNT\":\"378.89\",\"PYMT\":[{\"CT\":\"CA\",\"A1\":\"20\",\"round_amount\":\"-0.01\"}],\"OPRD\":[{\"SP\":\"Crystal\",\"itemcode_conexxus\":\"\",\"F1\":\"095\",\"FN\":\"ETHANOL on Pump 05\",\"A1\":\"20.01\",\"Q1\":\"12.59\",\"subTotalDiscounts\":\"0\",\"originalPPU\":\"1.589\",\"PR\":\"1.589\",\"D2\":\"-0.000\",\"AI\":\"250219134747\",\"RI\":\"347475408105\",\"DT\":\"20250219134747\",\"PN\":\"05\",\"H1\":\"\",\"NO\":\"54081\",\"TV\":\"\",\"PM\":\"\"},{\"Q1\":\"-1.0000000000002\",\"PR\":\"0.01\",\"A1\":\"-0.010000000000002\",\"F1\":\"998\",\"FN\":\"Cash Rounding\",\"AI\":\"000000000000\",\"RI\":\"000000158232\",\"DT\":\"20250219134849\"}]}"

Define lnLen.i=StringByteLength(lcTxt,#PB_Ascii)
Dim laTxt.a(lnLen)
NewMap lmRcvd2.s()
PokeS(@laTxt(0),lcTxt,lnLen,#PB_Ascii)
ln2=FindString(lcTxt,":",ln2+1)
Repeat
   lnToken=ln2-6
   If laTxt(ln2)=34
      ln2 = FindString(lcTxt,#DQUOTE$,ln2+2)
      lmRcvd2(PeekS(@laTxt(lnToken),4,#PB_Ascii)) = PeekS(@laTxt(lnToken+7),ln2-lnToken-8,#PB_Ascii)
   Else
      ln2 = FindString(lcTxt,"]",ln2+1)
      lmRcvd2(PeekS(@laTxt(lnToken),4,#PB_Ascii)) = PeekS(@laTxt(lnToken)+6,ln2-lnToken-6,#PB_Ascii)
   EndIf
   ln2=FindString(lcTxt,":",ln2+1)
Until ln2=0

Simon White
dCipher Computing
Post Reply