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.
RH58
Posts: 2 Joined: Wed May 07, 2025 1:42 am
Post
by RH58 » Wed May 07, 2025 2:23 am
I am trying to retrieve values from a returned JSON using XPRIM_RandomAccessJsonReader.
I am very new to this and have been using the web page as a reference
https://docs.lansa.com/14/en/lansa018/c ... 1_0085.htm
The JSON I receive is:
Code: Select all
{
"name":"X0010GetNextNumber",
"template":"D0000065",
"submitted":true,
"result":
{
"output":
[
{"id":1,"value":"01"},
{"id":2,"value":1},
{"id":3,"value":""},
{"id":4,"value":""},
{"id":5,"value":0},
{"id":6,"value":0},
{"id":7,"value":""},
{"id":8,"value":60484}
]
}
}
I need to retrieve the value assigned to id 8 (60484 in this example).
The code I have created (using example from the above web page) is :
Code: Select all
#Reader.SetSourceHttpResponse HTTPRESPONSE(#Request.Response) ERRORINFO(#ErrorInfo)
IF (#ErrorInfo.OK.IsFalse)
RETURN
ENDIF
BEGIN_LOOP USING(#JCount) TO(8)
USE BUILTIN(numeric_string) WITH_ARGS(#JCount) TO_GET(#@Ch)
CHANGE FIELD(#JSONPath) TO('''result/output/''')
SUBSTRING FIELD(#@Ch 1 1) INTO_FIELD(#JSONPath 15 1)
#Reader.BeginObjectWithPath( #JSONPath )
#xIDn := #Reader.ReadnumberWithPath( '''id''' )
IF (#xIDn = 8)
#xjsonch := #Reader.ReadStringWithPath( '''value''' ).asNativeString
#Reader.EndObject
LEAVE
ENDIF
#Reader.EndObject
END_LOOP
The value for field #xIDN is not being set.
Any help to get this working will be greatly appreciated.
Dino
Posts: 472 Joined: Fri Jul 19, 2019 7:49 am
Location: Robbinsville, NC
Contact:
Post
by Dino » Wed May 07, 2025 4:45 am
Problem to use a loop is that values returned are a mix of numbers and strings....
Code: Select all
Define_Com Class( #XPRIM_RandomAccessJsonReader ) Name( #Reader ) Reference( *DEFERRED )
Define_Com Class(#XPRIM_ErrorInfo) Name(#ErrorObject) Reference(*DEFERRED)
#STD_NVARC := #Reader.ReadStringWithName( "name" ).asNativeString
#STD_NVARC := #Reader.ReadStringWithName( "template" ).asNativeString
#STD_BOOL := #Reader.ReadBooleanWithName( "submitted" )
#Reader.BeginObjectWithName Name("result") Found(#Found) /* Begin Object 2 */
IF #Found
#Reader.BeginArrayWithName Name("output") Found(#Found) /* Begin Array 1 */
IF #Found
#Reader.BeginObjectAtIndex Index(1) Found(#Found) /* Begin Object 3 for index 1 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString #Reader.EndObject /* End Object 3 */
ENDIF
#Reader.BeginObjectAtIndex Index(2) Found(#Found) /* Begin Object 3 for index 2 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NUM := #Reader.ReadNumberWithName( "value" )
#Reader.EndObject /* End Object 3 */
ENDIF
#Reader.BeginObjectAtIndex Index(3) Found(#Found) /* Begin Object 3 for index 3 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString
#Reader.EndObject /* End Object 3 */
ENDIF
#Reader.BeginObjectAtIndex Index(4) Found(#Found) /* Begin Object 3 for index 4 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString
#Reader.EndObject /* End Object 3 */
ENDIF
#Reader.BeginObjectAtIndex Index(5) Found(#Found) /* Begin Object 3 for index 5 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NUM := #Reader.ReadNumberWithName( "value" )
#Reader.EndObject /* End Object 3 */
ENDIF
#Reader.BeginObjectAtIndex Index(6) Found(#Found) /* Begin Object 3 for index 6 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NUM := #Reader.ReadNumberWithName( "value" )
#Reader.EndObject /* End Object 3 */
ENDIF
#Reader.BeginObjectAtIndex Index(7) Found(#Found) /* Begin Object 3 for index 7 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString #Reader.EndObject /* End Object 3 */
ENDIF
#Reader.BeginObjectAtIndex Index(8) Found(#Found) /* Begin Object 3 for index 8 index in Array 1 */
IF #Found
#STD_NUM := #Reader.ReadNumberWithName( "id" )
#STD_NUM := #Reader.ReadNumberWithName( "value" )
#Reader.EndObject /* End Object 3 */
ENDIF
#Reader.EndArray /* End Array 1 */
ENDIF
#Reader.EndObject /* End Object 2 */
ENDIF
#Reader.EndObject /* End Object 1 */
ENDIF
RH58
Posts: 2 Joined: Wed May 07, 2025 1:42 am
Post
by RH58 » Wed May 07, 2025 6:34 pm
Hi Dino,
Thank you for your reply. That has helped a lot.