How can I read JSON object containing keyed paired values ?

This Q&A forum allows users to post and respond to "How Do I Do ....." questions. Please do not use to report (suspected) errors - you must use your regional help desk for this. The information contained in this forum has not been validated by LANSA and, as such, LANSA cannot guarantee the accuracy of the information.
Post Reply
DEVP
Posts: 7
Joined: Mon Mar 26, 2018 11:29 pm

How can I read JSON object containing keyed paired values ?

Post by DEVP »

The API returns a JSON object with product IDs as keys and their respective quantities as values? i.e keyed pair value.
i.e. { "product_id_1": "quantity_1", "product_id_2": "quantity_2", "product_id_3": "quantity_3"}

The following code only returns the quantity, and not the product IDs..

For Each(#Stock_levels) In(#Reader.ReadObjectWithPath( '/' ))
#QUANTITY := #Stock_levels.AsNumber
Endfor

From the example response ....
{
"109": "1.00000",
"110": "33.00000",
"114": "0.00000"
}

We are getting ...

#QUANTITY = 1.0
#QUANTITY = 33.0
#QUANTITY = 0.0

how do I also return the product IDs i.e "keys" i.e. 109, 110 and 114?

Thanks
cesarrafael
Posts: 32
Joined: Tue Dec 01, 2015 3:44 am

Re: How can I read JSON object containing keyed paired values ?

Post by cesarrafael »

Hi DEVP,

Take a look at the "xDemoWebJsonViewer". Maybe it helps...
Tim McEntee
Posts: 57
Joined: Thu May 26, 2016 8:46 am

Re: How can I read JSON object containing keyed paired values ?

Post by Tim McEntee »

Hi Devp

When you are extracting data from Name Value pairs usually you supply the Name and get the value. I'm not sure if you can run through the properties in an object using the X_PRIM Json tools. Someone might know how.

You could write code that reads the JSON string one char at a time. Trips would be "{" start object; "}" end object and end of quantity; ":" end of Product Id; "," end of quantity

Tim
DEVP
Posts: 7
Joined: Mon Mar 26, 2018 11:29 pm

Re: How can I read JSON object containing keyed paired values ?

Post by DEVP »

Thank you for the responses - I have resolved the issue by moving the response to NVARCHAR string field, then extracting the name and value pairs into an array thus :

Def_List Name(#List_Stock_Levels) Fields(#product_id #quantity) Counter(#LISTCOUNT) Type(*WORKING) Entrys(*MAX)
Define Field(#product_id) Reffld(#BSDPRID)
Define Field(#quantity) Reffld(#BSDQTY)
...
...

#jsonShipmentsObject <= #Reader.ReadObjectWithPath( '/' )
#ResultNVARCHAR := #jsonShipmentsObject.AsString
#STD_NUML #CPM_D1_0 := 1

Begin_Loop

#STD_NUML := #ResultNVARCHAR.PositionOf( '"', #STD_NUML )
Leave If(#STD_NUML = 0)
#STD_INT := #ResultNVARCHAR.PositionOf( '"', (#STD_NUML + 1) )
Leave If(#STD_INT = 0)

#STD_NVARC := #ResultNVARCHAR.Substring( (#STD_NUML + 1), (#STD_INT - (#STD_NUML + 1)) )

Case Of_Field(#CPM_D1_0)

When Value_Is(= 1)

#Product_Id := #STD_NVARC.AsNativeString

Otherwise

#quantity := #STD_NVARC.AsNumber

Add_Entry To_List(#List_Stock_Levels)

#CPM_D1_0 := 0

Endcase

#CPM_D1_0 += 1
#STD_NUML := #STD_INT + 1

End_Loop
Post Reply