Problems with XPRIM_RandomAccessJsonReader

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
RH58
Posts: 2
Joined: Wed May 07, 2025 1:42 am

Problems with XPRIM_RandomAccessJsonReader

Post by RH58 »

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.
User avatar
Dino
Posts: 472
Joined: Fri Jul 19, 2019 7:49 am
Location: Robbinsville, NC
Contact:

Re: Problems with XPRIM_RandomAccessJsonReader

Post by Dino »

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

Re: Problems with XPRIM_RandomAccessJsonReader

Post by RH58 »

Hi Dino,

Thank you for your reply. That has helped a lot. :)
Post Reply